AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Player Class Reference

#include "Player.h"

Inheritance diagram for Player:
Unit GridObject< Player > WorldObject Object WorldLocation Position

Classes

struct  BgBattlegroundQueueID_Rec
 
struct  ChatFloodThrottle
 

Public Types

typedef std::unordered_map< ObjectGuid::LowType, Item * > ItemMap
 
typedef std::set< uint32DFQuestsDoneList
 
- Public Types inherited from Unit
typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::list< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 Player (WorldSession *session)
 
 ~Player () override
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void SetObjectScale (float scale) override
 
bool hasSpanishClient ()
 
bool TeleportTo (uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
 
bool TeleportTo (WorldLocation const &loc, uint32 options=0, Unit *target=nullptr)
 
bool TeleportToEntryPoint ()
 
void SetSummonPoint (uint32 mapid, float x, float y, float z, uint32 delay=0, bool asSpectator=false)
 
bool IsSummonAsSpectator () const
 
void SetSummonAsSpectator (bool on)
 
void SummonIfPossible (bool agree, ObjectGuid summoner_guid)
 
time_t GetSummonExpireTimer () const
 
bool Create (ObjectGuid::LowType guidlow, CharacterCreateInfo *createInfo)
 
void Update (uint32 time) override
 
PlayerFlags GetPlayerFlags () const
 
bool HasPlayerFlag (PlayerFlags flags) const
 
void SetPlayerFlag (PlayerFlags flags)
 
void RemovePlayerFlag (PlayerFlags flags)
 
void ReplaceAllPlayerFlags (PlayerFlags flags)
 
bool IsClass (Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
 
void SetInWater (bool apply)
 
bool IsInWater () const override
 
bool IsFalling () const
 
bool IsInAreaTriggerRadius (AreaTrigger const *trigger, float delta=0.f) const
 
void SendInitialPacketsBeforeAddToMap ()
 
void SendInitialPacketsAfterAddToMap ()
 
void SendTransferAborted (uint32 mapid, TransferAbortReason reason, uint8 arg=0)
 
void SendInstanceResetWarning (uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap)
 
bool CanInteractWithQuestGiver (Object *questGiver)
 
CreatureGetNPCIfCanInteractWith (ObjectGuid guid, uint32 npcflagmask)
 
GameObjectGetGameObjectIfCanInteractWith (ObjectGuid guid, GameobjectTypes type) const
 
void ToggleAFK ()
 
void ToggleDND ()
 
bool isAFK () const
 
bool isDND () const
 
uint8 GetChatTag () const
 
uint32 GetBarberShopCost (uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const *newSkin=nullptr)
 
PlayerSocialGetSocial ()
 
void InitTaxiNodesForLevel ()
 
bool ActivateTaxiPathTo (std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
 
bool ActivateTaxiPathTo (uint32 taxi_path_id, uint32 spellid=1)
 
void CleanupAfterTaxiFlight ()
 
void ContinueTaxiFlight ()
 
void SendTaxiNodeStatusMultiple ()
 
bool IsCommentator () const
 
void SetCommentator (bool on)
 
bool IsDeveloper () const
 
void SetDeveloper (bool on)
 
bool isAcceptWhispers () const
 
void SetAcceptWhispers (bool on)
 
bool IsGameMaster () const
 
void SetGameMaster (bool on)
 
bool isGMChat () const
 
void SetGMChat (bool on)
 
bool isTaxiCheater () const
 
void SetTaxiCheater (bool on)
 
bool isGMVisible () const
 
void SetGMVisible (bool on)
 
bool Has310Flyer (bool checkAllSpells, uint32 excludeSpellId=0)
 
void SetHas310Flyer (bool on)
 
void SetPvPDeath (bool on)
 
void GiveXP (uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
 
void GiveLevel (uint8 level)
 
void InitStatsForLevel (bool reapplyMods=false)
 
bool HasActivePowerType (Powers power) override
 
bool GetCommandStatus (uint32 command) const
 
void SetCommandStatusOn (uint32 command)
 
void SetCommandStatusOff (uint32 command)
 
uint32 GetTotalPlayedTime ()
 
uint32 GetLevelPlayedTime ()
 
void setDeathState (DeathState s, bool despawn=false) override
 
void SetRestState (uint32 triggerId)
 
void RemoveRestState ()
 
uint32 GetXPRestBonus (uint32 xp)
 
float GetRestBonus () const
 
void SetRestBonus (float restBonusNew)
 
bool HasRestFlag (RestFlag restFlag) const
 
void SetRestFlag (RestFlag restFlag, uint32 triggerId=0)
 
void RemoveRestFlag (RestFlag restFlag)
 
uint32 GetInnTriggerId () const
 
PetStableGetPetStable ()
 
PetStableGetOrInitPetStable ()
 
PetStable const * GetPetStable () const
 
PetGetPet () const
 
PetSummonPet (uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration=0s, uint32 healthPct=0)
 
void RemovePet (Pet *pet, PetSaveMode mode, bool returnreagent=false)
 
bool CanPetResurrect ()
 
bool IsExistPet ()
 
PetCreatePet (Creature *creatureTarget, uint32 spellID=0)
 
PetCreatePet (uint32 creatureEntry, uint32 spellID=0)
 
uint32 GetPhaseMaskForSpawn () const
 
void Say (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles said message in regular chat based on declared language and in config pre-defined Range. More...
 
void Say (uint32 textId, WorldObject const *target=nullptr) override
 
void Yell (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles yelled message in regular chat based on declared language and in config pre-defined Range. More...
 
void Yell (uint32 textId, WorldObject const *target=nullptr) override
 
void TextEmote (std::string_view text, WorldObject const *=nullptr, bool=false) override
 Outputs an universal text which is supposed to be an action. More...
 
void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false) override
 
void Whisper (std::string_view text, Language language, Player *receiver, bool=false) override
 Handles whispers from Addons and players based on sender, receiver's guid and language. More...
 
void Whisper (uint32 textId, Player *target, bool isBossWhisper=false) override
 
void SetVirtualItemSlot (uint8 i, Item *item)
 
void SetSheath (SheathState sheathed) override
 
uint8 FindEquipSlot (ItemTemplate const *proto, uint32 slot, bool swap) const
 
uint32 GetItemCount (uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
 
uint32 GetItemCountWithLimitCategory (uint32 limitCategory, Item *skipItem=nullptr) const
 
ItemGetItemByGuid (ObjectGuid guid) const
 
ItemGetItemByEntry (uint32 entry) const
 
ItemGetItemByPos (uint16 pos) const
 
ItemGetItemByPos (uint8 bag, uint8 slot) const
 
BagGetBagByPos (uint8 slot) const
 
uint32 GetFreeInventorySpace () const
 
ItemGetUseableItemByPos (uint8 bag, uint8 slot) const
 
ItemGetWeaponForAttack (WeaponAttackType attackType, bool useable=false) const
 
bool HasWeapon (WeaponAttackType type) const override
 
bool HasWeaponForAttack (WeaponAttackType type) const override
 
ItemGetShield (bool useable=false) const
 
std::vector< Item * > & GetItemUpdateQueue ()
 
bool IsValidPos (uint16 pos, bool explicit_pos)
 
bool IsValidPos (uint8 bag, uint8 slot, bool explicit_pos)
 
uint8 GetBankBagSlotCount () const
 
void SetBankBagSlotCount (uint8 count)
 
bool HasItemCount (uint32 item, uint32 count=1, bool inBankAlso=false) const
 
bool HasItemFitToSpellRequirements (SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
 
bool CanNoReagentCast (SpellInfo const *spellInfo) const
 
bool HasItemOrGemWithIdEquipped (uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
 
bool HasItemOrGemWithLimitCategoryEquipped (uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
 
InventoryResult CanTakeMoreSimilarItems (Item *pItem) const
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count) const
 
InventoryResult CanStoreNewItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
 
InventoryResult CanStoreItems (Item **pItem, int32 count) const
 
InventoryResult CanEquipNewItem (uint8 slot, uint16 &dest, uint32 item, bool swap) const
 
InventoryResult CanEquipItem (uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanEquipUniqueItem (Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanEquipUniqueItem (ItemTemplate const *itemProto, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanUnequipItems (uint32 item, uint32 count) const
 
InventoryResult CanUnequipItem (uint16 src, bool swap) const
 
InventoryResult CanBankItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanUseItem (Item *pItem, bool not_loading=true) const
 
bool HasItemTotemCategory (uint32 TotemCategory) const
 
bool IsTotemCategoryCompatiableWith (ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
 
InventoryResult CanUseItem (ItemTemplate const *pItem) const
 
InventoryResult CanUseAmmo (uint32 item) const
 
InventoryResult CanRollForItemInLFG (ItemTemplate const *item, WorldObject const *lootedObject) const
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId, AllowedLooterSet &allowedLooters)
 
ItemStoreItem (ItemPosCountVec const &pos, Item *pItem, bool update)
 
ItemEquipNewItem (uint16 pos, uint32 item, bool update)
 
ItemEquipItem (uint16 pos, Item *pItem, bool update)
 
void AutoUnequipOffhandIfNeed (bool force=false)
 
bool StoreNewItemInBestSlots (uint32 item_id, uint32 item_count)
 
void AutoStoreLoot (uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
 
void AutoStoreLoot (uint32 loot_id, LootStore const &store, bool broadcast=false)
 
LootItemStoreLootItem (uint8 lootSlot, Loot *loot, InventoryResult &msg)
 
void UpdateLootAchievements (LootItem *item, Loot *loot)
 
void UpdateTitansGrip ()
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count, Item *pItem, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 entry, uint32 count, Item *pItem=nullptr, bool swap=false, uint32 *no_space_count=nullptr) const
 
void AddRefundReference (ObjectGuid itemGUID)
 
void DeleteRefundReference (ObjectGuid itemGUID)
 
void ApplyEquipCooldown (Item *pItem)
 
void SetAmmo (uint32 item)
 
void RemoveAmmo ()
 
float GetAmmoDPS () const
 
bool CheckAmmoCompatibility (ItemTemplate const *ammo_proto) const
 
void QuickEquipItem (uint16 pos, Item *pItem)
 
void VisualizeItem (uint8 slot, Item *pItem)
 
void SetVisibleItemSlot (uint8 slot, Item *pItem)
 
ItemBankItem (ItemPosCountVec const &dest, Item *pItem, bool update)
 
ItemBankItem (uint16 pos, Item *pItem, bool update)
 
void RemoveItem (uint8 bag, uint8 slot, bool update, bool swap=false)
 
void MoveItemFromInventory (uint8 bag, uint8 slot, bool update)
 
void MoveItemToInventory (ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
 
void RemoveItemDependentAurasAndCasts (Item *pItem)
 
void DestroyItem (uint8 bag, uint8 slot, bool update)
 
void DestroyItemCount (uint32 item, uint32 count, bool update, bool unequip_check=false)
 
void DestroyItemCount (Item *item, uint32 &count, bool update)
 
void DestroyConjuredItems (bool update)
 
void DestroyZoneLimitedItem (bool update, uint32 new_zone)
 
void SplitItem (uint16 src, uint16 dst, uint32 count)
 
void SwapItem (uint16 src, uint16 dst)
 
void AddItemToBuyBackSlot (Item *pItem, uint32 money)
 
ItemGetItemFromBuyBackSlot (uint32 slot)
 
void RemoveItemFromBuyBackSlot (uint32 slot, bool del)
 
uint32 GetMaxKeyringSize () const
 
void SendEquipError (InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
 
void SendBuyError (BuyResult msg, Creature *creature, uint32 item, uint32 param)
 
void SendSellError (SellResult msg, Creature *creature, ObjectGuid guid, uint32 param)
 
void AddWeaponProficiency (uint32 newflag)
 
void AddArmorProficiency (uint32 newflag)
 
uint32 GetWeaponProficiency () const
 
uint32 GetArmorProficiency () const
 
bool IsTwoHandUsed () const
 
void SendNewItem (Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
 
bool BuyItemFromVendorSlot (ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot)
 
bool _StoreOrEquipNewItem (uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
 
float GetReputationPriceDiscount (Creature const *creature) const
 
float GetReputationPriceDiscount (FactionTemplateEntry const *factionTemplate) const
 
PlayerGetTrader () const
 
TradeDataGetTradeData () const
 
void TradeCancel (bool sendback, TradeStatus status=TRADE_STATUS_TRADE_CANCELED)
 
CinematicMgrGetCinematicMgr () const
 
void UpdateEnchantTime (uint32 time)
 
void UpdateSoulboundTradeItems ()
 
void AddTradeableItem (Item *item)
 
void RemoveTradeableItem (Item *item)
 
void UpdateItemDuration (uint32 time, bool realtimeonly=false)
 
void AddEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurationsReferences (Item *item)
 
void RemoveArenaEnchantments (EnchantmentSlot slot)
 
void AddEnchantmentDuration (Item *item, EnchantmentSlot slot, uint32 duration)
 
void ApplyEnchantment (Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
 
void ApplyEnchantment (Item *item, bool apply)
 
void UpdateSkillEnchantments (uint16 skill_id, uint16 curr_value, uint16 new_value)
 
void SendEnchantmentDurations ()
 
void UpdateEnchantmentDurations ()
 
void BuildEnchantmentsInfoData (WorldPacket *data)
 
void AddItemDurations (Item *item)
 
void RemoveItemDurations (Item *item)
 
void SendItemDurations ()
 
void LoadCorpse (PreparedQueryResult result)
 
void LoadPet ()
 
bool AddItem (uint32 itemId, uint32 count)
 
void PrepareGossipMenu (WorldObject *source, uint32 menuId=0, bool showQuests=false)
 
void SendPreparedGossip (WorldObject *source)
 
void OnGossipSelect (WorldObject *source, uint32 gossipListId, uint32 menuId)
 
uint32 GetGossipTextId (uint32 menuId, WorldObject *source)
 
uint32 GetGossipTextId (WorldObject *source)
 
void ToggleInstantFlight ()
 
int32 GetQuestLevel (Quest const *quest) const
 
void PrepareQuestMenu (ObjectGuid guid)
 
void SendPreparedQuest (ObjectGuid guid)
 
bool IsActiveQuest (uint32 quest_id) const
 
Quest const * GetNextQuest (ObjectGuid guid, Quest const *quest)
 
bool CanSeeStartQuest (Quest const *quest)
 
bool CanTakeQuest (Quest const *quest, bool msg)
 
bool CanAddQuest (Quest const *quest, bool msg)
 
bool CanCompleteQuest (uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
 
bool CanCompleteRepeatableQuest (Quest const *quest)
 
bool CanRewardQuest (Quest const *quest, bool msg)
 
bool CanRewardQuest (Quest const *quest, uint32 reward, bool msg)
 
void AddQuestAndCheckCompletion (Quest const *quest, Object *questGiver)
 
void AddQuest (Quest const *quest, Object *questGiver)
 
void AbandonQuest (uint32 quest_id)
 
void CompleteQuest (uint32 quest_id)
 
void IncompleteQuest (uint32 quest_id)
 
void RewardQuest (Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
 
void SetRewardedQuest (uint32 quest_id)
 
void FailQuest (uint32 quest_id)
 
bool SatisfyQuestSkill (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLevel (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLog (bool msg)
 
bool SatisfyQuestPreviousQuest (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestClass (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestRace (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestReputation (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestStatus (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestConditions (Quest const *qInfo, bool msg)
 
bool SatisfyQuestTimed (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestExclusiveGroup (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestNextChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestPrevChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestDay (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestWeek (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestMonth (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestSeasonal (Quest const *qInfo, bool msg) const
 
bool GiveQuestSourceItem (Quest const *quest)
 
bool TakeQuestSourceItem (uint32 questId, bool msg)
 
uint32 CalculateQuestRewardXP (Quest const *quest)
 
bool GetQuestRewardStatus (uint32 quest_id) const
 
QuestStatus GetQuestStatus (uint32 quest_id) const
 
void SetQuestStatus (uint32 questId, QuestStatus status, bool update=true)
 
void RemoveActiveQuest (uint32 questId, bool update=true)
 
void RemoveRewardedQuest (uint32 questId, bool update=true)
 
void SendQuestUpdate (uint32 questId)
 
QuestGiverStatus GetQuestDialogStatus (Object *questGiver)
 
float GetQuestRate (bool isDFQuest=false)
 
void SetDailyQuestStatus (uint32 quest_id)
 
bool IsDailyQuestDone (uint32 quest_id)
 
void SetWeeklyQuestStatus (uint32 quest_id)
 
void SetMonthlyQuestStatus (uint32 quest_id)
 
void SetSeasonalQuestStatus (uint32 quest_id)
 
void ResetDailyQuestStatus ()
 
void ResetWeeklyQuestStatus ()
 
void ResetMonthlyQuestStatus ()
 
void ResetSeasonalQuestStatus (uint16 event_id)
 
uint16 FindQuestSlot (uint32 quest_id) const
 
uint32 GetQuestSlotQuestId (uint16 slot) const
 
uint32 GetQuestSlotState (uint16 slot) const
 
uint16 GetQuestSlotCounter (uint16 slot, uint8 counter) const
 
uint32 GetQuestSlotTime (uint16 slot) const
 
void SetQuestSlot (uint16 slot, uint32 quest_id, uint32 timer=0)
 
void SetQuestSlotCounter (uint16 slot, uint8 counter, uint16 count)
 
void SetQuestSlotState (uint16 slot, uint32 state)
 
void RemoveQuestSlotState (uint16 slot, uint32 state)
 
void SetQuestSlotTimer (uint16 slot, uint32 timer)
 
void SwapQuestSlot (uint16 slot1, uint16 slot2)
 
uint16 GetReqKillOrCastCurrentCount (uint32 quest_id, int32 entry)
 
void AreaExploredOrEventHappens (uint32 questId)
 
void GroupEventHappens (uint32 questId, WorldObject const *pEventObject)
 
void ItemAddedQuestCheck (uint32 entry, uint32 count)
 
void ItemRemovedQuestCheck (uint32 entry, uint32 count)
 
void KilledMonster (CreatureTemplate const *cInfo, ObjectGuid guid)
 
void KilledMonsterCredit (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void KilledPlayerCredit (uint16 count=1)
 
void KilledPlayerCreditForQuest (uint16 count, Quest const *quest)
 
void KillCreditGO (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void TalkedToCreature (uint32 entry, ObjectGuid guid)
 
void MoneyChanged (uint32 value)
 
void ReputationChanged (FactionEntry const *factionEntry)
 
void ReputationChanged2 (FactionEntry const *factionEntry)
 
bool HasQuestForItem (uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
 
bool HasQuestForGO (int32 GOId) const
 
bool HasQuest (uint32 questId) const
 
void UpdateForQuestWorldObjects ()
 
bool CanShareQuest (uint32 quest_id) const
 
void SendQuestComplete (uint32 quest_id)
 
void SendQuestReward (Quest const *quest, uint32 XP)
 
void SendQuestFailed (uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
 
void SendQuestTimerFailed (uint32 quest_id)
 
void SendCanTakeQuestResponse (uint32 msg) const
 
void SendQuestConfirmAccept (Quest const *quest, Player *pReceiver)
 
void SendPushToPartyResponse (Player const *player, uint8 msg) const
 
void SendQuestUpdateAddItem (Quest const *quest, uint32 item_idx, uint16 count)
 
void SendQuestUpdateAddCreatureOrGo (Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
 
void SendQuestUpdateAddPlayer (Quest const *quest, uint16 old_count, uint16 add_count)
 
ObjectGuid GetDivider ()
 
void SetDivider (ObjectGuid guid=ObjectGuid::Empty)
 
uint32 GetInGameTime ()
 
void SetInGameTime (uint32 time)
 
void AddTimedQuest (uint32 quest_id)
 
void RemoveTimedQuest (uint32 quest_id)
 
bool HasPvPForcingQuest () const
 
bool LoadFromDB (ObjectGuid guid, CharacterDatabaseQueryHolder const &holder)
 
bool isBeingLoaded () const override
 
void Initialize (ObjectGuid::LowType guid)
 
void SaveToDB (bool create, bool logout)
 
void SaveToDB (CharacterDatabaseTransaction trans, bool create, bool logout)
 
void SaveInventoryAndGoldToDB (CharacterDatabaseTransaction trans)
 
void SaveGoldToDB (CharacterDatabaseTransaction trans)
 
void _SaveSkills (CharacterDatabaseTransaction trans)
 
void SetBindPoint (ObjectGuid guid)
 
void SendTalentWipeConfirm (ObjectGuid guid)
 
void ResetPetTalents ()
 
void CalcRage (uint32 damage, bool attacker)
 
void RegenerateAll ()
 
void Regenerate (Powers power)
 
void RegenerateHealth ()
 
void setRegenTimerCount (uint32 time)
 
void setWeaponChangeTimer (uint32 time)
 
uint32 GetMoney () const
 
bool ModifyMoney (int32 amount, bool sendError=true)
 
bool HasEnoughMoney (uint32 amount) const
 
bool HasEnoughMoney (int32 amount) const
 
void SetMoney (uint32 value)
 
RewardedQuestSet const & getRewardedQuests () const
 
QuestStatusMapgetQuestStatusMap ()
 
QuestStatusSaveMapGetQuestStatusSaveMap ()
 
std::size_t GetRewardedQuestCount () const
 
bool IsQuestRewarded (uint32 quest_id) const
 
UnitGetSelectedUnit () const
 
PlayerGetSelectedPlayer () const
 
void SetTarget (ObjectGuid=ObjectGuid::Empty) override
 
void SetSelection (ObjectGuid guid)
 Used for serverside target changes, does not apply to players. More...
 
void SendMailResult (uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, ObjectGuid::LowType item_guid=0, uint32 item_count=0)
 
void SendNewMail ()
 
void UpdateNextMailTimeAndUnreads ()
 
void AddNewMailDeliverTime (time_t deliver_time)
 
void RemoveMail (uint32 id)
 
void AddMail (Mail *mail)
 
uint32 GetMailSize ()
 
MailGetMail (uint32 id)
 
PlayerMails const & GetMails () const
 
void SendItemRetrievalMail (uint32 itemEntry, uint32 count)
 
void SendItemRetrievalMail (std::vector< std::pair< uint32, uint32 > > mailItems)
 
ItemGetMItem (ObjectGuid::LowType itemLowGuid)
 
void AddMItem (Item *it)
 
bool RemoveMItem (ObjectGuid::LowType itemLowGuid)
 
void PetSpellInitialize ()
 
void CharmSpellInitialize ()
 
void PossessSpellInitialize ()
 
void VehicleSpellInitialize ()
 
void SendRemoveControlBar ()
 
bool HasSpell (uint32 spell) const override
 
bool HasActiveSpell (uint32 spell) const
 
TrainerSpellState GetTrainerSpellState (TrainerSpell const *trainer_spell) const
 
bool IsSpellFitByClassAndRace (uint32 spell_id) const
 
bool IsNeedCastPassiveSpellAtLearn (SpellInfo const *spellInfo) const
 
void SendProficiency (ItemClass itemClass, uint32 itemSubclassMask)
 
void SendInitialSpells ()
 
void SendLearnPacket (uint32 spellId, bool learn)
 
bool addSpell (uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
 
bool _addSpell (uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
 
void learnSpell (uint32 spellId, bool temporary=false, bool learnFromSkill=false)
 
void removeSpell (uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
 
void resetSpells ()
 
void LearnCustomSpells ()
 
void LearnDefaultSkills ()
 
void LearnDefaultSkill (uint32 skillId, uint16 rank)
 
void learnQuestRewardedSpells ()
 
void learnQuestRewardedSpells (Quest const *quest)
 
void learnSpellHighRank (uint32 spellid)
 
void SetReputation (uint32 factionentry, float value)
 
uint32 GetReputation (uint32 factionentry) const
 
std::string const & GetGuildName ()
 
uint32 GetFreeTalentPoints () const
 
void SetFreeTalentPoints (uint32 points)
 
bool resetTalents (bool noResetCost=false)
 
uint32 resetTalentsCost () const
 
bool IsMaxLevel () const
 
void InitTalentForLevel ()
 
void BuildPlayerTalentsInfoData (WorldPacket *data)
 
void BuildPetTalentsInfoData (WorldPacket *data)
 
void SendTalentsInfoData (bool pet)
 
void LearnTalent (uint32 talentId, uint32 talentRank, bool command=false)
 
void LearnPetTalent (ObjectGuid petGuid, uint32 talentId, uint32 talentRank)
 
bool addTalent (uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
 
void _removeTalent (PlayerTalentMap::iterator &itr, uint8 specMask)
 
void _removeTalent (uint32 spellId, uint8 specMask)
 
void _removeTalentAurasAndSpells (uint32 spellId)
 
void _addTalentAurasAndSpells (uint32 spellId)
 
bool HasTalent (uint32 spell_id, uint8 spec) const
 
uint32 CalculateTalentsPoints () const
 
void SetBonusTalentCount (uint32 count)
 
uint32 GetBonusTalentCount ()
 
void AddBonusTalent (uint32 count)
 
void RemoveBonusTalent (uint32 count)
 
void UpdateSpecCount (uint8 count)
 
uint8 GetActiveSpec () const
 
uint8 GetActiveSpecMask () const
 
void SetActiveSpec (uint8 spec)
 
uint8 GetSpecsCount () const
 
void SetSpecsCount (uint8 count)
 
void ActivateSpec (uint8 spec)
 
void LoadActions (PreparedQueryResult result)
 
void GetTalentTreePoints (uint8(&specPoints)[3]) const
 
uint8 GetMostPointsTalentTree () const
 
bool HasTankSpec ()
 
bool HasMeleeSpec ()
 
bool HasCasterSpec ()
 
bool HasHealSpec ()
 
uint32 GetSpec (int8 spec=-1)
 
void InitGlyphsForLevel ()
 
void SetGlyphSlot (uint8 slot, uint32 slottype)
 
uint32 GetGlyphSlot (uint8 slot) const
 
void SetGlyph (uint8 slot, uint32 glyph, bool save)
 
uint32 GetGlyph (uint8 slot) const
 
uint32 GetFreePrimaryProfessionPoints () const
 
void SetFreePrimaryProfessions (uint16 profs)
 
void InitPrimaryProfessions ()
 
PlayerSpellMap const & GetSpellMap () const
 
PlayerSpellMapGetSpellMap ()
 
SpellCooldowns const & GetSpellCooldownMap () const
 
SpellCooldownsGetSpellCooldownMap ()
 
SkillStatusMap const & GetSkillStatusMap () const
 
SkillStatusMapGetSkillStatusMap ()
 
void AddSpellMod (SpellModifier *mod, bool apply)
 
bool IsAffectedBySpellmod (SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
 
bool HasSpellMod (SpellModifier *mod, Spell *spell)
 
template<class T >
void ApplySpellMod (uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
 
void RemoveSpellMods (Spell *spell)
 
void RestoreSpellMods (Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void RestoreAllSpellMods (uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void DropModCharge (SpellModifier *mod, Spell *spell)
 
void SetSpellModTakingSpell (Spell *spell, bool apply)
 
bool HasSpellCooldown (uint32 spell_id) const override
 
bool HasSpellItemCooldown (uint32 spell_id, uint32 itemid) const override
 
uint32 GetSpellCooldownDelay (uint32 spell_id) const
 
void AddSpellAndCategoryCooldowns (SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
 
void AddSpellCooldown (uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
 
void _AddSpellCooldown (uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void ModifySpellCooldown (uint32 spellId, int32 cooldown)
 
void SendCooldownEvent (SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
 
void ProhibitSpellSchool (SpellSchoolMask idSchoolMask, uint32 unTimeMs) override
 
void RemoveSpellCooldown (uint32 spell_id, bool update=false)
 
void SendClearCooldown (uint32 spell_id, Unit *target)
 
GlobalCooldownMgrGetGlobalCooldownMgr ()
 
void RemoveCategoryCooldown (uint32 cat)
 
void RemoveArenaSpellCooldowns (bool removeActivePetCooldowns=false)
 
void RemoveAllSpellCooldown ()
 
void _LoadSpellCooldowns (PreparedQueryResult result)
 
void _SaveSpellCooldowns (CharacterDatabaseTransaction trans, bool logout)
 
uint32 GetLastPotionId ()
 
void SetLastPotionId (uint32 item_id)
 
void UpdatePotionCooldown (Spell *spell=nullptr)
 
void setResurrectRequestData (ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
 
void clearResurrectRequestData ()
 
bool isResurrectRequestedBy (ObjectGuid guid) const
 
bool isResurrectRequested () const
 
void ResurectUsingRequestData ()
 
uint8 getCinematic () const
 
void setCinematic (uint8 cine)
 
ActionButtonaddActionButton (uint8 button, uint32 action, uint8 type)
 
void removeActionButton (uint8 button)
 
ActionButton const * GetActionButton (uint8 button)
 
void SendInitialActionButtons () const
 
void SendActionButtons (uint32 state) const
 
bool IsActionButtonDataValid (uint8 button, uint32 action, uint8 type)
 
void UpdatePvPState ()
 
void UpdateFFAPvPState (bool reset=true)
 
void SetPvP (bool state)
 
void UpdatePvP (bool state, bool _override=false)
 
void UpdateZone (uint32 newZone, uint32 newArea, bool force=false)
 
void UpdateArea (uint32 newArea)
 
void SetNeedZoneUpdate (bool needUpdate)
 
void UpdateZoneDependentAuras (uint32 zone_id)
 
void UpdateAreaDependentAuras (uint32 area_id)
 
void UpdateAfkReport (time_t currTime)
 checks the 15 afk reports per 5 minutes limit More...
 
void UpdatePvPFlag (time_t currTime)
 
void UpdateFFAPvPFlag (time_t currTime)
 
void UpdateContestedPvP (uint32 currTime)
 
void SetContestedPvPTimer (uint32 newTime)
 
void ResetContestedPvP ()
 
void UpdateDuelFlag (time_t currTime)
 
void CheckDuelDistance (time_t currTime)
 
void DuelComplete (DuelCompleteType type)
 
void SendDuelCountdown (uint32 counter)
 
bool IsGroupVisibleFor (Player const *p) const
 
bool IsInSameGroupWith (Player const *p) const
 
bool IsInSameRaidWith (Player const *p) const
 
void UninviteFromGroup ()
 
void RemoveFromGroup (RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT)
 
void SendUpdateToOutOfRangeGroupMembers ()
 
void SetInGuild (uint32 GuildId)
 
void SetRank (uint8 rankId)
 
uint8 GetRank () const
 
void SetGuildIdInvited (uint32 GuildId)
 
uint32 GetGuildId () const
 
GuildGetGuild () const
 
uint32 GetGuildIdInvited ()
 
void SetInArenaTeam (uint32 ArenaTeamId, uint8 slot, uint8 type)
 
void SetArenaTeamInfoField (uint8 slot, ArenaTeamInfoType type, uint32 value)
 
uint32 GetArenaPersonalRating (uint8 slot) const
 
uint32 GetArenaTeamId (uint8 slot) const
 
void SetArenaTeamIdInvited (uint32 ArenaTeamId)
 
uint32 GetArenaTeamIdInvited ()
 
Difficulty GetDifficulty (bool isRaid) const
 
Difficulty GetDungeonDifficulty () const
 
Difficulty GetRaidDifficulty () const
 
Difficulty GetStoredRaidDifficulty () const
 
void SetDungeonDifficulty (Difficulty dungeon_difficulty)
 
void SetRaidDifficulty (Difficulty raid_difficulty)
 
void StoreRaidMapDifficulty ()
 
bool UpdateSkill (uint32 skill_id, uint32 step)
 
bool UpdateSkillPro (uint16 SkillId, int32 Chance, uint32 step)
 
bool UpdateCraftSkill (uint32 spellid)
 
bool UpdateGatherSkill (uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator=1)
 
bool UpdateFishingSkill ()
 
uint32 GetBaseDefenseSkillValue () const
 
uint32 GetBaseWeaponSkillValue (WeaponAttackType attType) const
 
uint32 GetSpellByProto (ItemTemplate *proto)
 
float GetHealthBonusFromStamina ()
 
float GetManaBonusFromIntellect ()
 
bool UpdateStats (Stats stat) override
 
bool UpdateAllStats () override
 
void ApplySpellPenetrationBonus (int32 amount, bool apply)
 
void UpdateResistances (uint32 school) override
 
void UpdateArmor () override
 
void UpdateMaxHealth () override
 
void UpdateMaxPower (Powers power) override
 
void ApplyFeralAPBonus (int32 amount, bool apply)
 
void UpdateAttackPowerAndDamage (bool ranged=false) override
 
void UpdateShieldBlockValue ()
 
void ApplySpellPowerBonus (int32 amount, bool apply)
 
void UpdateSpellDamageAndHealingBonus ()
 
void ApplyRatingMod (CombatRating cr, int32 value, bool apply)
 
void UpdateRating (CombatRating cr)
 
void UpdateAllRatings ()
 
void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) override
 
void UpdateDefenseBonusesMod ()
 
void RecalculateRating (CombatRating cr)
 
float GetMeleeCritFromAgility ()
 
void GetDodgeFromAgility (float &diminishing, float &nondiminishing)
 
float GetMissPercentageFromDefence () const
 
float GetSpellCritFromIntellect ()
 
float OCTRegenHPPerSpirit ()
 
float OCTRegenMPPerSpirit ()
 
float GetRatingMultiplier (CombatRating cr) const
 
float GetRatingBonusValue (CombatRating cr) const
 
uint32 GetBaseSpellPowerBonus ()
 
int32 GetSpellPenetrationItemMod () const
 
float GetExpertiseDodgeOrParryReduction (WeaponAttackType attType) const
 
void UpdateBlockPercentage ()
 
void UpdateCritPercentage (WeaponAttackType attType)
 
void UpdateAllCritPercentages ()
 
void UpdateParryPercentage ()
 
void UpdateDodgePercentage ()
 
void UpdateMeleeHitChances ()
 
void UpdateRangedHitChances ()
 
void UpdateSpellHitChances ()
 
void UpdateAllSpellCritChances ()
 
void UpdateSpellCritChance (uint32 school)
 
void UpdateArmorPenetration (int32 amount)
 
void UpdateExpertise (WeaponAttackType attType)
 
void ApplyManaRegenBonus (int32 amount, bool apply)
 
void ApplyHealthRegenBonus (int32 amount, bool apply)
 
void UpdateManaRegen ()
 
void UpdateEnergyRegen ()
 
void UpdateRuneRegen (RuneType rune)
 
ObjectGuid GetLootGUID () const
 
void SetLootGUID (ObjectGuid guid)
 
void RemovedInsignia (Player *looterPlr)
 
WorldSessionGetSession () const
 
void SetSession (WorldSession *sess)
 
void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target) override
 
void DestroyForPlayer (Player *target, bool onDeath=false) const override
 
void SendLogXPGain (uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
 
void SendAttackSwingCantAttack ()
 
void SendAttackSwingCancelAttack ()
 
void SendAttackSwingDeadTarget ()
 
void SendAttackSwingNotInRange ()
 
void SendAttackSwingBadFacingAttack ()
 
void SendAutoRepeatCancel (Unit *target)
 
void SendExplorationExperience (uint32 Area, uint32 Experience)
 
void SendDungeonDifficulty (bool IsInGroup)
 
void SendRaidDifficulty (bool IsInGroup, int32 forcedDifficulty=-1)
 
void SendResetInstanceSuccess (uint32 MapId)
 
void SendResetInstanceFailed (uint32 reason, uint32 MapId)
 
void SendResetFailedNotify (uint32 mapid)
 
bool UpdatePosition (float x, float y, float z, float orientation, bool teleport=false) override
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessTerrainStatusUpdate () override
 
void SendMessageToSet (WorldPacket const *data, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self, bool includeMargin, bool ownTeamOnly, bool required3dDist=false) const
 
void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const override
 
void SendTeleportAckPacket ()
 
CorpseGetCorpse () const
 
void SpawnCorpseBones (bool triggerSave=true)
 
CorpseCreateCorpse ()
 
void RemoveCorpse ()
 
void KillPlayer ()
 
bool HasCorpse () const
 
WorldLocation GetCorpseLocation () const
 
uint32 GetResurrectionSpellId ()
 
void ResurrectPlayer (float restore_percent, bool applySickness=false)
 
void BuildPlayerRepop ()
 
void RepopAtGraveyard ()
 
void SendDurabilityLoss ()
 
void DurabilityLossAll (double percent, bool inventory)
 
void DurabilityLoss (Item *item, double percent)
 
void DurabilityPointsLossAll (int32 points, bool inventory)
 
void DurabilityPointsLoss (Item *item, int32 points)
 
void DurabilityPointLossForEquipSlot (EquipmentSlots slot)
 
uint32 DurabilityRepairAll (bool cost, float discountMod, bool guildBank)
 
uint32 DurabilityRepair (uint16 pos, bool cost, float discountMod, bool guildBank)
 
void UpdateMirrorTimers ()
 
void StopMirrorTimers ()
 
bool IsMirrorTimerActive (MirrorTimerType type)
 
void SetMovement (PlayerMovementType pType)
 
bool CanJoinConstantChannelInZone (ChatChannelsEntry const *channel, AreaTableEntry const *zone)
 
void JoinedChannel (Channel *c)
 
void LeftChannel (Channel *c)
 
void CleanupChannels ()
 
void ClearChannelWatch ()
 
void UpdateLFGChannel ()
 
void UpdateLocalChannels (uint32 newZone)
 
void UpdateDefense ()
 
void UpdateWeaponSkill (Unit *victim, WeaponAttackType attType, Item *item=nullptr)
 
void UpdateCombatSkills (Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
 
void SetSkill (uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
 
uint16 GetMaxSkillValue (uint32 skill) const
 
uint16 GetPureMaxSkillValue (uint32 skill) const
 
uint16 GetSkillValue (uint32 skill) const
 
uint16 GetBaseSkillValue (uint32 skill) const
 
uint16 GetPureSkillValue (uint32 skill) const
 
int16 GetSkillPermBonusValue (uint32 skill) const
 
int16 GetSkillTempBonusValue (uint32 skill) const
 
uint16 GetSkillStep (uint16 skill) const
 
bool HasSkill (uint32 skill) const
 
void learnSkillRewardedSpells (uint32 id, uint32 value)
 
WorldLocationGetTeleportDest ()
 
bool IsBeingTeleported () const
 
bool IsBeingTeleportedNear () const
 
bool IsBeingTeleportedFar () const
 
void SetSemaphoreTeleportNear (time_t tm)
 
void SetSemaphoreTeleportFar (time_t tm)
 
time_t GetSemaphoreTeleportNear () const
 
time_t GetSemaphoreTeleportFar () const
 
void ProcessDelayedOperations ()
 
uint32 GetDelayedOperations () const
 
void ScheduleDelayedOperation (uint32 operation)
 
void CheckAreaExploreAndOutdoor ()
 
TeamId GetTeamId (bool original=false) const
 
void SetFactionForRace (uint8 race)
 
void setTeamId (TeamId teamid)
 
void InitDisplayIds ()
 
bool IsAtGroupRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtLootRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtRecruitAFriendDistance (WorldObject const *pOther) const
 
void RewardPlayerAndGroupAtKill (Unit *victim, bool isBattleGround)
 
void RewardPlayerAndGroupAtEvent (uint32 creature_id, WorldObject *pRewardSource)
 
bool isHonorOrXPTarget (Unit *victim) const
 
bool GetsRecruitAFriendBonus (bool forXP)
 
uint8 GetGrantableLevels ()
 
void SetGrantableLevels (uint8 val)
 
ReputationMgrGetReputationMgr ()
 
ReputationMgr const & GetReputationMgr () const
 
ReputationRank GetReputationRank (uint32 faction_id) const
 
void RewardReputation (Unit *victim)
 
void RewardReputation (Quest const *quest)
 
float CalculateReputationGain (ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
 
void UpdateSkillsForLevel ()
 
void UpdateSkillsToMaxSkillsForLevel ()
 
void ModifySkillBonus (uint32 skillid, int32 val, bool talent)
 
void RewardExtraBonusTalentPoints (uint32 bonusTalentPoints)
 
void UpdateHonorFields ()
 
bool RewardHonor (Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
 
uint32 GetHonorPoints () const
 
uint32 GetArenaPoints () const
 
void ModifyHonorPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 
void ModifyArenaPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 If trans is specified, honor save query will be added to trans. More...
 
uint32 GetMaxPersonalArenaRatingRequirement (uint32 minarenaslot) const
 If trans is specified, arena point save query will be added to trans. More...
 
void SetHonorPoints (uint32 value)
 
void SetArenaPoints (uint32 value)
 
void SaveHealthBeforeDuel ()
 
void SaveManaBeforeDuel ()
 
void RestoreHealthAfterDuel ()
 
void RestoreManaAfterDuel ()
 
SpellCooldowns GetSpellCooldowns () const
 
void SetDrunkValue (uint8 newDrunkValue, uint32 itemId=0)
 
uint8 GetDrunkValue () const
 
int32 GetFakeDrunkValue () const
 
void UpdateInvisibilityDrunkDetect ()
 
uint32 GetDeathTimer () const
 
uint32 GetCorpseReclaimDelay (bool pvp) const
 
void UpdateCorpseReclaimDelay ()
 
int32 CalculateCorpseReclaimDelay (bool load=false)
 
void SendCorpseReclaimDelay (uint32 delay)
 
uint32 GetShieldBlockValue () const override
 
bool CanParry () const
 
void SetCanParry (bool value)
 
bool CanBlock () const
 
void SetCanBlock (bool value)
 
bool CanTitanGrip () const
 
void SetCanTitanGrip (bool value)
 
bool CanTameExoticPets () const
 
void SetRegularAttackTime ()
 
void SetBaseModValue (BaseModGroup modGroup, BaseModType modType, float value)
 
void HandleBaseModValue (BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
 
float GetBaseModValue (BaseModGroup modGroup, BaseModType modType) const
 
float GetTotalBaseModValue (BaseModGroup modGroup) const
 
float GetTotalPercentageModValue (BaseModGroup modGroup) const
 
void _ApplyAllStatBonuses ()
 
void _RemoveAllStatBonuses ()
 
void ResetAllPowers ()
 
SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const override
 
void _ApplyWeaponDependentAuraMods (Item *item, WeaponAttackType attackType, bool apply)
 
void _ApplyWeaponDependentAuraCritMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyWeaponDependentAuraDamageMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyItemMods (Item *item, uint8 slot, bool apply)
 
void _RemoveAllItemMods ()
 
void _ApplyAllItemMods ()
 
void _ApplyAllLevelScaleItemMods (bool apply)
 
void _ApplyItemBonuses (ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
 
void _ApplyWeaponDamage (uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
 
void _ApplyAmmoBonuses ()
 
bool EnchantmentFitsRequirements (uint32 enchantmentcondition, int8 slot)
 
void ToggleMetaGemsActive (uint8 exceptslot, bool apply)
 
void CorrectMetaGemEnchants (uint8 slot, bool apply)
 
void InitDataForForm (bool reapplyMods=false)
 
void ApplyItemEquipSpell (Item *item, bool apply, bool form_change=false)
 
void ApplyEquipSpell (SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
 
void UpdateEquipSpellsAtFormChange ()
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
 
void CastItemUseSpell (Item *item, SpellCastTargets const &targets, uint8 cast_count, uint32 glyphIndex)
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item *item, ItemTemplate const *proto)
 
void SendEquipmentSetList ()
 
void SetEquipmentSet (uint32 index, EquipmentSet eqset)
 
void DeleteEquipmentSet (uint64 setGuid)
 
void SendInitWorldStates (uint32 zoneId, uint32 areaId)
 
void SendUpdateWorldState (uint32 variable, uint32 value) const
 
void SendDirectMessage (WorldPacket const *data) const
 
void SendBGWeekendWorldStates ()
 
void SendBattlefieldWorldStates ()
 
void GetAurasForTarget (Unit *target, bool force=false)
 
void SendLoot (ObjectGuid guid, LootType loot_type)
 
void SendLootError (ObjectGuid guid, LootError error)
 
void SendLootRelease (ObjectGuid guid)
 
void SendNotifyLootItemRemoved (uint8 lootSlot)
 
void SendNotifyLootMoneyRemoved ()
 
bool InBattleground () const
 
bool InArena () const
 
uint32 GetBattlegroundId () const
 
BattlegroundTypeId GetBattlegroundTypeId () const
 
uint32 GetCurrentBattlegroundQueueSlot () const
 
bool IsInvitedForBattlegroundInstance () const
 
bool IsCurrentBattlegroundRandom () const
 
BGDataGetBGData ()
 
void SetBGData (BGData &bgdata)
 
BattlegroundGetBattleground (bool create=false) const
 
bool InBattlegroundQueue (bool ignoreArena=false) const
 
bool IsDeserter () const
 
BattlegroundQueueTypeId GetBattlegroundQueueTypeId (uint32 index) const
 
uint32 GetBattlegroundQueueIndex (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool IsInvitedForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool InBattlegroundQueueForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
void SetBattlegroundId (uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId)
 
uint32 AddBattlegroundQueueId (BattlegroundQueueTypeId val)
 
bool HasFreeBattlegroundQueueId () const
 
void RemoveBattlegroundQueueId (BattlegroundQueueTypeId val)
 
void SetInviteForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
 
bool IsInvitedForBattlegroundInstance (uint32 instanceId) const
 
TeamId GetBgTeamId () const
 
void LeaveBattleground (Battleground *bg=nullptr)
 
bool CanJoinToBattleground () const
 
bool CanReportAfkDueToLimit ()
 
void ReportedAfkBy (Player *reporter)
 This player has been blamed to be inactive in a battleground. More...
 
void ClearAfkReports ()
 
bool GetBGAccessByLevel (BattlegroundTypeId bgTypeId) const
 
bool CanUseBattlegroundObject (GameObject *gameobject) const
 
bool isTotalImmune () const
 
bool CanCaptureTowerPoint () const
 
bool GetRandomWinner ()
 
void SetRandomWinner (bool isWinner)
 
OutdoorPvPGetOutdoorPvP () const
 
bool IsOutdoorPvPActive ()
 
bool IsImmuneToEnvironmentalDamage ()
 
uint32 EnvironmentalDamage (EnviromentalDamage type, uint32 damage)
 
void UpdateSpeakTime (ChatFloodThrottle::Index index)
 
bool CanSpeak () const
 
void UpdateFallInformationIfNeed (MovementInfo const &minfo, uint16 opcode)
 
void SetFallInformation (uint32 time, float z)
 
void HandleFall (MovementInfo const &movementInfo)
 
bool canFlyInZone (uint32 mapid, uint32 zone, SpellInfo const *bySpell)
 
void SetClientControl (Unit *target, bool allowMove, bool packetOnly=false)
 
void SetMover (Unit *target)
 
void SetSeer (WorldObject *target)
 
void SetViewpoint (WorldObject *target, bool apply)
 
WorldObjectGetViewpoint () const
 
void StopCastingCharm (Aura *except=nullptr)
 
void StopCastingBindSight (Aura *except=nullptr)
 
uint32 GetSaveTimer () const
 
void SetSaveTimer (uint32 timer)
 
void SaveRecallPosition ()
 
void SetHomebind (WorldLocation const &loc, uint32 areaId)
 
WorldLocation GetStartPosition () const
 
WorldLocation const & GetEntryPoint () const
 
void SetEntryPoint ()
 
bool HaveAtClient (WorldObject const *u) const
 
bool HaveAtClient (ObjectGuid guid) const
 
bool IsNeverVisible () const override
 
bool IsVisibleGloballyFor (Player const *player) const
 
void GetInitialVisiblePackets (Unit *target)
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void UpdateVisibilityForPlayer (bool mapChange=false)
 
void UpdateVisibilityOf (WorldObject *target)
 
void UpdateTriggerVisibility ()
 
template<class T >
void UpdateVisibilityOf (T *target, UpdateData &data, std::vector< Unit * > &visibleNow)
 
bool HasAtLoginFlag (AtLoginFlags f) const
 
void SetAtLoginFlag (AtLoginFlags f)
 
void RemoveAtLoginFlag (AtLoginFlags flags, bool persist=false)
 
bool IsUsingLfg ()
 
bool inRandomLfgDungeon ()
 
uint32 GetTemporaryUnsummonedPetNumber () const
 
void SetTemporaryUnsummonedPetNumber (uint32 petnumber)
 
void UnsummonPetTemporaryIfAny ()
 
void ResummonPetTemporaryUnSummonedIfAny ()
 
bool IsPetNeedBeTemporaryUnsummoned () const
 
bool CanResummonPet (uint32 spellid)
 
void SendCinematicStart (uint32 CinematicSequenceId) const
 
void SendMovieStart (uint32 MovieId)
 
uint32 DoRandomRoll (uint32 minimum, uint32 maximum)
 
uint16 GetMaxSkillValueForLevel () const
 
bool IsFFAPvP ()
 
bool IsPvP ()
 
void UpdateHomebindTime (uint32 time)
 
void BindToInstance ()
 
void SetPendingBind (uint32 instanceId, uint32 bindTimer)
 
bool HasPendingBind () const
 
uint32 GetPendingBind () const
 
void SendRaidInfo ()
 
void SendSavedInstances ()
 
void PrettyPrintRequirementsQuestList (const std::vector< const ProgressionRequirement * > &missingQuests) const
 
void PrettyPrintRequirementsAchievementsList (const std::vector< const ProgressionRequirement * > &missingAchievements) const
 
void PrettyPrintRequirementsItemsList (const std::vector< const ProgressionRequirement * > &missingItems) const
 
bool Satisfy (DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
 
bool CheckInstanceLoginValid ()
 
bool CheckInstanceCount (uint32 instanceId) const
 
void AddInstanceEnterTime (uint32 instanceId, time_t enterTime)
 
uint32 GetLastPetNumber () const
 
void SetLastPetNumber (uint32 petnumber)
 
uint32 GetLastPetSpell () const
 
void SetLastPetSpell (uint32 petspell)
 
GroupGetGroupInvite ()
 
void SetGroupInvite (Group *group)
 
GroupGetGroup ()
 
const GroupGetGroup () const
 
GroupReferenceGetGroupRef ()
 
void SetGroup (Group *group, int8 subgroup=-1)
 
uint8 GetSubGroup () const
 
uint32 GetGroupUpdateFlag () const
 
void SetGroupUpdateFlag (uint32 flag)
 
uint64 GetAuraUpdateMaskForRaid () const
 
void SetAuraUpdateMaskForRaid (uint8 slot)
 
PlayerGetNextRandomRaidMember (float radius)
 
PartyResult CanUninviteFromGroup (ObjectGuid targetPlayerGUID=ObjectGuid::Empty) const
 
void SetBattlegroundOrBattlefieldRaid (Group *group, int8 subgroup=-1)
 
void RemoveFromBattlegroundOrBattlefieldRaid ()
 
GroupGetOriginalGroup ()
 
GroupReferenceGetOriginalGroupRef ()
 
uint8 GetOriginalSubGroup () const
 
void SetOriginalGroup (Group *group, int8 subgroup=-1)
 
void SetPassOnGroupLoot (bool bPassOnGroupLoot)
 
bool GetPassOnGroupLoot () const
 
MapReferenceGetMapRef ()
 
void SetMap (Map *map) override
 
void ResetMap () override
 
bool CanTeleport ()
 
void SetCanTeleport (bool value)
 
bool CanKnockback ()
 
void SetCanKnockback (bool value)
 
bool isAllowedToLoot (Creature const *creature)
 
DeclinedName const * GetDeclinedNames () const
 
uint8 GetRunesState () const
 
RuneType GetBaseRune (uint8 index) const
 
RuneType GetCurrentRune (uint8 index) const
 
uint32 GetRuneCooldown (uint8 index) const
 
uint32 GetGracePeriod (uint8 index) const
 
uint32 GetRuneBaseCooldown (uint8 index, bool skipGrace)
 
bool IsBaseRuneSlotsOnCooldown (RuneType runeType) const
 
RuneType GetLastUsedRune ()
 
void SetLastUsedRune (RuneType type)
 
void SetBaseRune (uint8 index, RuneType baseRune)
 
void SetCurrentRune (uint8 index, RuneType currentRune)
 
void SetRuneCooldown (uint8 index, uint32 cooldown)
 
void SetGracePeriod (uint8 index, uint32 period)
 
void SetRuneConvertAura (uint8 index, AuraEffect const *aura)
 
void AddRuneByAuraEffect (uint8 index, RuneType newType, AuraEffect const *aura)
 
void RemoveRunesByAuraEffect (AuraEffect const *aura)
 
void RestoreBaseRune (uint8 index)
 
void ConvertRune (uint8 index, RuneType newType)
 
void ResyncRunes (uint8 count)
 
void AddRunePower (uint8 index)
 
void InitRunes ()
 
void SendRespondInspectAchievements (Player *player) const
 
bool HasAchieved (uint32 achievementId) const
 
void ResetAchievements ()
 
void CheckAllAchievementCriteria ()
 
void ResetAchievementCriteria (AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
 
void UpdateAchievementCriteria (AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
 
void StartTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
 
void RemoveTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry)
 
void CompletedAchievement (AchievementEntry const *entry)
 
AchievementMgrGetAchievementMgr () const
 
void SetCreationTime (Seconds creationTime)
 
Seconds GetCreationTime () const
 
bool HasTitle (uint32 bitIndex) const
 
bool HasTitle (CharTitlesEntry const *title) const
 
void SetTitle (CharTitlesEntry const *title, bool lost=false)
 
void SetCurrentTitle (CharTitlesEntry const *title, bool clear=false)
 
bool CanSeeSpellClickOn (Creature const *creature) const
 
bool CanSeeVendor (Creature const *creature) const
 
uint32 GetChampioningFaction () const
 
void SetChampioningFaction (uint32 faction)
 
float GetAverageItemLevel ()
 
float GetAverageItemLevelForDF ()
 
void ClearWhisperWhiteList ()
 
void AddWhisperWhiteList (ObjectGuid guid)
 
bool IsInWhisperWhiteList (ObjectGuid guid)
 
void RemoveFromWhisperWhiteList (ObjectGuid guid)
 
bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true) override
 
bool SetCanFly (bool apply, bool packetOnly=false) override
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
bool SetWaterWalking (bool apply, bool packetOnly=false) override
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
bool SetFeatherFall (bool apply, bool packetOnly=false) override
 
bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true) override
 
bool CanFly () const override
 
bool CanEnterWater () const override
 
void AdditionalSavingAddMask (uint8 mask)
 
bool IsSpectator () const
 
void SetIsSpectator (bool on)
 
bool NeedSendSpectatorData () const
 
void SetPendingSpectatorForBG (uint32 bgInstanceId)
 
bool HasPendingSpectatorForBG (uint32 bgInstanceId) const
 
void SetPendingSpectatorInviteInstanceId (uint32 bgInstanceId)
 
uint32 GetPendingSpectatorInviteInstanceId () const
 
bool HasReceivedSpectatorResetFor (ObjectGuid guid)
 
void ClearReceivedSpectatorResetFor ()
 
void AddReceivedSpectatorResetFor (ObjectGuid guid)
 
void RemoveReceivedSpectatorResetFor (ObjectGuid guid)
 
void setRuneWeaponGUID (ObjectGuid guid)
 
ObjectGuid getRuneWeaponGUID ()
 
bool CanSeeDKPet () const
 
void SetShowDKPet (bool on)
 
void PrepareCharmAISpells ()
 
bool NeedToSaveGlyphs ()
 
void SetNeedToSaveGlyphs (bool val)
 
uint32 GetMountBlockId ()
 
void SetMountBlockId (uint32 mount)
 
float GetRealParry () const
 
float GetRealDodge () const
 
const PlayerTalentMapGetTalentMap () const
 
uint32 GetNextSave () const
 
SpellModList const & GetSpellModList (uint32 type) const
 
void SetServerSideVisibility (ServerSideVisibilityType type, AccountTypes sec)
 
void SetServerSideVisibilityDetect (ServerSideVisibilityType type, AccountTypes sec)
 
void SetFarSightDistance (float radius)
 
void ResetFarSightDistance ()
 
Optional< float > GetFarSightDistance () const
 
float GetSightRange (WorldObject const *target=nullptr) const override
 
std::string GetPlayerName ()
 
PlayerSetting GetPlayerSetting (std::string source, uint8 index)
 
void UpdatePlayerSetting (std::string source, uint8 index, uint32 value)
 
void SendSystemMessage (std::string_view msg, bool escapeCharacters=false)
 
std::string GetDebugInfo () const override
 
const PendingSpellCastRequestGetCastRequest (uint32 category) const
 
bool CanExecutePendingSpellCastRequest (SpellInfo const *spellInfo)
 
void ExecuteOrCancelSpellCastRequest (PendingSpellCastRequest *castRequest, bool isCancel=false)
 
bool CanRequestSpellCast (SpellInfo const *spellInfo)
 
- Public Member Functions inherited from Unit
 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only. More...
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h. More...
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h. More...
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote) More...
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells. More...
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client. More...
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop() More...
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead. More...
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (uint8 attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras. More...
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras. More...
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras. More...
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit More...
 
bool CanFreeMove () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------— More...
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline. More...
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) More...
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client. More...
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client. More...
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client. More...
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------— More...
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
virtual void Update (uint32 diff)
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
virtual void SetPhaseMask (uint32 newPhaseMask, bool update)
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void CleanupsBeforeDelete (bool finalCleanup=true)
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
virtual uint8 getLevelForTarget (WorldObject const *) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
void SetWorldObject (bool apply)
 
bool IsPermanentWorldObject () const
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim. More...
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
virtual void AddToWorld ()
 
virtual void RemoveFromWorld ()
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
virtual uint32 GetDynamicFlags () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
virtual void ReplaceAllDynamicFlags (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
virtual void BuildUpdate (UpdateDataMapType &, UpdatePlayerSet &)
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
virtual std::string GetDebugInfo () const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 
- Public Member Functions inherited from GridObject< Player >
bool IsInGrid () const
 
void AddToGrid (GridRefMgr< Player > &m)
 
void RemoveFromGrid ()
 

Static Public Member Functions

static bool BuildEnumData (PreparedQueryResult result, WorldPacket *data)
 
static uint8 GetAttackBySlot (uint8 slot)
 
static bool IsInventoryPos (uint16 pos)
 
static bool IsInventoryPos (uint8 bag, uint8 slot)
 
static bool IsEquipmentPos (uint16 pos)
 
static bool IsEquipmentPos (uint8 bag, uint8 slot)
 
static bool IsBagPos (uint16 pos)
 
static bool IsBankPos (uint16 pos)
 
static bool IsBankPos (uint8 bag, uint8 slot)
 
static uint32 GetDefaultGossipMenuForSource (WorldObject *source)
 
static uint32 GetZoneIdFromDB (ObjectGuid guid)
 
static bool LoadPositionFromDB (uint32 &mapid, float &x, float &y, float &z, float &o, bool &in_flight, ObjectGuid::LowType guid)
 
static bool IsValidGender (uint8 Gender)
 
static void Customize (CharacterCustomizeInfo const *customizeInfo, CharacterDatabaseTransaction trans)
 
static void SavePositionInDB (uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid)
 
static void SavePositionInDB (WorldLocation const &loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction trans)
 
static void DeleteFromDB (ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
 
static void DeleteOldCharacters ()
 
static void DeleteOldCharacters (uint32 keepDays)
 
static void DeleteOldRecoveryItems ()
 
static void DeleteOldRecoveryItems (uint32 keepDays)
 
static void RemoveFromGroup (Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
 
static void RemovePetitionsAndSigns (ObjectGuid guid, uint32 type)
 
static uint32 GetArenaTeamIdFromDB (ObjectGuid guid, uint8 slot)
 
static void LeaveAllArenaTeams (ObjectGuid guid)
 
static void ResetInstances (ObjectGuid guid, uint8 method, bool isRaid)
 Reset all solo instances and optionally send a message on success for each. More...
 
static void OfflineResurrect (ObjectGuid const guid, CharacterDatabaseTransaction trans)
 
static TeamId TeamIdForRace (uint8 race)
 
static DrunkenState GetDrunkenstateByValue (uint8 value)
 
- Static Public Member Functions inherited from Unit
static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

std::string autoReplyMsg
 
PlayerTaxi m_taxi
 
time_t m_logintime
 
time_t m_Last_tick
 
uint32 m_Played_time [MAX_PLAYED_TIME_INDEX]
 
bool m_mailsUpdated
 
uint8 unReadMails
 
time_t m_nextMailDelivereTime
 
ItemMap mMitems
 
PvPInfo pvpInfo
 
std::unique_ptr< DuelInfoduel
 
PlayerMenuPlayerTalkClass
 
std::vector< ItemSetEffect * > ItemSetEff
 
SafeUnitPointer m_mover
 
WorldObjectm_seer
 
std::set< Unit * > m_isInSharedVisionOf
 
uint32 m_recallMap
 
float m_recallX
 
float m_recallY
 
float m_recallZ
 
float m_recallO
 
uint32 m_homebindMapId
 
uint16 m_homebindAreaId
 
float m_homebindX
 
float m_homebindY
 
float m_homebindZ
 
GuidUnorderedSet m_clientGUIDs
 
std::vector< Unit * > m_newVisible
 
uint8 m_forced_speed_changes [MAX_MOVE_TYPE]
 
DFQuestsDoneList m_DFQuests
 
uint32 m_HomebindTimer
 
bool m_InstanceValid
 
Spellm_spellModTakingSpell
 
bool isDebugAreaTriggers
 
uint32 m_pendingSpectatorForBG
 
uint32 m_pendingSpectatorInviteInstanceId
 
GuidSet m_receivedSpectatorResetFor
 
ObjectGuid m_drwGUID
 
uint32 m_charmUpdateTimer
 
std::deque< PendingSpellCastRequestSpellQueue
 
- Public Attributes inherited from Unit
uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Static Public Attributes

static std::unordered_map< int, bgZoneRefbgZoneIdToFillWorldStates = {}
 

Protected Types

typedef std::set< uint32QuestSet
 
typedef std::set< uint32SeasonalQuestSet
 
typedef std::unordered_map< uint32, SeasonalQuestSetSeasonalEventQuestMap
 
typedef std::list< Channel * > JoinedChannelsList
 
- Protected Types inherited from Unit
typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

uint32 GetSpellQueueWindow () const
 
void ProcessSpellQueue ()
 
void _LoadActions (PreparedQueryResult result)
 
void _LoadAuras (PreparedQueryResult result, uint32 timediff)
 
void _LoadGlyphAuras ()
 
void _LoadInventory (PreparedQueryResult result, uint32 timeDiff)
 
void _LoadMail (PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
 
void _LoadQuestStatus (PreparedQueryResult result)
 
void _LoadQuestStatusRewarded (PreparedQueryResult result)
 
void _LoadDailyQuestStatus (PreparedQueryResult result)
 
void _LoadWeeklyQuestStatus (PreparedQueryResult result)
 
void _LoadMonthlyQuestStatus (PreparedQueryResult result)
 
void _LoadSeasonalQuestStatus (PreparedQueryResult result)
 
void _LoadRandomBGStatus (PreparedQueryResult result)
 
void _LoadGroup ()
 
void _LoadSkills (PreparedQueryResult result)
 
void _LoadSpells (PreparedQueryResult result)
 
void _LoadFriendList (PreparedQueryResult result)
 
bool _LoadHomeBind (PreparedQueryResult result)
 
void _LoadDeclinedNames (PreparedQueryResult result)
 
void _LoadArenaTeamInfo ()
 
void _LoadEquipmentSets (PreparedQueryResult result)
 
void _LoadEntryPointData (PreparedQueryResult result)
 
void _LoadGlyphs (PreparedQueryResult result)
 
void _LoadTalents (PreparedQueryResult result)
 
void _LoadInstanceTimeRestrictions (PreparedQueryResult result)
 
void _LoadBrewOfTheMonth (PreparedQueryResult result)
 
void _LoadCharacterSettings (PreparedQueryResult result)
 
void _LoadPetStable (uint8 petStableSlots, PreparedQueryResult result)
 
void _SaveActions (CharacterDatabaseTransaction trans)
 
void _SaveAuras (CharacterDatabaseTransaction trans, bool logout)
 
void _SaveInventory (CharacterDatabaseTransaction trans)
 
void _SaveMail (CharacterDatabaseTransaction trans)
 
void _SaveQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveDailyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveWeeklyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveMonthlyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSeasonalQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSpells (CharacterDatabaseTransaction trans)
 
void _SaveEquipmentSets (CharacterDatabaseTransaction trans)
 
void _SaveEntryPoint (CharacterDatabaseTransaction trans)
 
void _SaveGlyphs (CharacterDatabaseTransaction trans)
 
void _SaveTalents (CharacterDatabaseTransaction trans)
 
void _SaveStats (CharacterDatabaseTransaction trans)
 
void _SaveCharacter (bool create, CharacterDatabaseTransaction trans)
 
void _SaveInstanceTimeRestrictions (CharacterDatabaseTransaction trans)
 
void _SavePlayerSettings (CharacterDatabaseTransaction trans)
 
void HandleSobering ()
 The player sobers by 1% every 9 seconds. More...
 
void SendMirrorTimer (MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
 
void StopMirrorTimer (MirrorTimerType Type)
 
void HandleDrowning (uint32 time_diff)
 
int32 getMaxTimer (MirrorTimerType timer)
 
void outDebugValues () const
 
void SendQuestGiverStatusMultiple ()
 
bool CanAlwaysSee (WorldObject const *obj) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
- Protected Member Functions inherited from Unit
 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures. More...
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsAlwaysVisibleFor (WorldObject const *) const
 
virtual bool IsInvisibleDueToDespawn () const
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
virtual void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target)
 
virtual void AddToObjectUpdate ()=0
 
virtual void RemoveFromObjectUpdate ()=0
 
void AddToObjectUpdateIfNeeded ()
 

Static Protected Member Functions

static Item_LoadMailedItem (ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
 

Protected Attributes

WhisperListContainer WhisperList
 
bool m_NeedToSaveGlyphs
 
uint32 m_MountBlockId
 
float m_realDodge
 
float m_realParry
 
uint32 m_charmAISpells [NUM_CAI_SPELLS]
 
uint32 m_AreaID
 
uint32 m_regenTimerCount
 
uint32 m_foodEmoteTimerCount
 
float m_powerFraction [MAX_POWERS]
 
uint32 m_contestedPvPTimer
 
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES_BgBattlegroundQueueID
 
BGData m_bgData
 
bool m_IsBGRandomWinner
 
EntryPointData m_entryPointData
 
QuestSet m_timedquests
 
QuestSet m_weeklyquests
 
QuestSet m_monthlyquests
 
SeasonalEventQuestMap m_seasonalquests
 
ObjectGuid m_divider
 
uint32 m_ingametime
 
time_t m_lastHonorUpdateTime
 
ObjectGuid m_lootGuid
 
TeamId m_team
 
uint32 m_nextSave
 
uint16 m_additionalSaveTimer
 
uint8 m_additionalSaveMask
 
uint16 m_hostileReferenceCheckTimer
 
std::array< ChatFloodThrottle, ChatFloodThrottle::MAXm_chatFloodData
 
Difficulty m_dungeonDifficulty
 
Difficulty m_raidDifficulty
 
Difficulty m_raidMapDifficulty
 
uint32 m_atLoginFlags
 
Itemm_items [PLAYER_SLOTS_COUNT]
 
uint32 m_currentBuybackSlot
 
std::vector< Item * > m_itemUpdateQueue
 
bool m_itemUpdateQueueBlocked
 
uint32 m_ExtraFlags
 
QuestStatusMap m_QuestStatus
 
QuestStatusSaveMap m_QuestStatusSave
 
RewardedQuestSet m_RewardedQuests
 
QuestStatusSaveMap m_RewardedQuestsSave
 
SkillStatusMap mSkillStatus
 
uint32 m_GuildIdInvited
 
uint32 m_ArenaTeamIdInvited
 
PlayerMails m_mail
 
PlayerSpellMap m_spells
 
PlayerTalentMap m_talents
 
uint32 m_lastPotionId
 
GlobalCooldownMgr m_GlobalCooldownMgr
 
uint8 m_activeSpec
 
uint8 m_specsCount
 
uint32 m_Glyphs [MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
 
ActionButtonList m_actionButtons
 
float m_auraBaseMod [BASEMOD_END][MOD_END]
 
int32 m_baseRatingValue [MAX_COMBAT_RATING]
 
uint32 m_baseSpellPower
 
uint32 m_baseFeralAP
 
uint32 m_baseManaRegen
 
uint32 m_baseHealthRegen
 
int32 m_spellPenetrationItemMod
 
SpellModList m_spellMods [MAX_SPELLMOD]
 
EnchantDurationList m_enchantDuration
 
ItemDurationList m_itemDuration
 
ItemDurationList m_itemSoulboundTradeable
 
std::mutex m_soulboundTradableLock
 
ObjectGuid m_resurrectGUID
 
uint32 m_resurrectMap
 
float m_resurrectX
 
float m_resurrectY
 
float m_resurrectZ
 
uint32 m_resurrectHealth
 
uint32 m_resurrectMana
 
WorldSessionm_session
 
JoinedChannelsList m_channels
 
uint8 m_cinematic
 
TradeDatam_trade
 
bool m_DailyQuestChanged
 
bool m_WeeklyQuestChanged
 
bool m_MonthlyQuestChanged
 
bool m_SeasonalQuestChanged
 
time_t m_lastDailyQuestTime
 
uint32 m_drunkTimer
 
uint32 m_weaponChangeTimer
 
uint32 m_zoneUpdateId
 
uint32 m_zoneUpdateTimer
 
uint32 m_areaUpdateId
 
uint32 m_deathTimer
 
time_t m_deathExpireTime
 
uint32 m_WeaponProficiency
 
uint32 m_ArmorProficiency
 
bool m_canParry
 
bool m_canBlock
 
bool m_canTitanGrip
 
uint8 m_swingErrorMsg
 
float m_ammoDPS
 
float m_Expertise
 
float m_OffhandExpertise
 
time_t _restTime
 
uint32 _innTriggerId
 
float _restBonus
 
uint32 _restFlagMask
 
uint32 m_resetTalentsCost
 
time_t m_resetTalentsTime
 
uint32 m_usedTalentCount
 
uint32 m_questRewardTalentCount
 
uint32 m_extraBonusTalentCount
 
PlayerSocialm_social
 
GroupReference m_group
 
GroupReference m_originalGroup
 
Groupm_groupInvite
 
uint32 m_groupUpdateMask
 
uint64 m_auraRaidUpdateMask
 
bool m_bPassOnGroupLoot
 
uint32 m_lastpetnumber
 
time_t m_summon_expire
 
uint32 m_summon_mapid
 
float m_summon_x
 
float m_summon_y
 
float m_summon_z
 
bool m_summon_asSpectator
 
DeclinedNamem_declinedname
 
Runesm_runes
 
EquipmentSets m_EquipmentSets
 
uint8 m_grantableLevels
 
bool m_needZoneUpdate
 
- Protected Attributes inherited from Unit
UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union {
   int32 *   m_int32Values
 
   uint32 *   m_uint32Values
 
   float *   m_floatValues
 
}; 
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef GuidSet RefundableItemsSet
 

Private Member Functions

InventoryResult CanStoreItem_InSpecificSlot (uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
 
InventoryResult CanStoreItem_InBag (uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
InventoryResult CanStoreItem_InInventorySlots (uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
Item_StoreItem (uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
 
Item_LoadItem (CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
 
void SendRefundInfo (Item *item)
 
void RefundItem (Item *item)
 
void AddKnownCurrency (uint32 itemId)
 
void AdjustQuestReqItemCount (Quest const *quest, QuestStatusData &questStatusData)
 
bool MustDelayTeleport () const
 
void SetMustDelayTeleport (bool setting)
 
bool HasDelayedTeleport () const
 
void SetHasDelayedTeleport (bool setting)
 
void UpdateCharmedAI ()
 

Private Attributes

CinematicMgr_cinematicMgr
 
RefundableItemsSet m_refundableItems
 
MapReference m_mapRef
 
uint32 m_lastFallTime
 
float m_lastFallZ
 
int32 m_MirrorTimer [MAX_TIMERS]
 
uint8 m_MirrorTimerFlags
 
uint8 m_MirrorTimerFlagsLast
 
bool m_isInWater
 
WorldLocation teleportStore_dest
 
uint32 teleportStore_options
 
time_t mSemaphoreTeleport_Near
 
time_t mSemaphoreTeleport_Far
 
uint32 m_DelayedOperations
 
bool m_bMustDelayTeleport
 
bool m_bHasDelayedTeleport
 
bool m_canTeleport
 
bool m_canKnockback
 
std::unique_ptr< PetStablem_petStable
 
uint32 m_temporaryUnsummonedPetNumber
 
uint32 m_oldpetspell
 
AchievementMgrm_achievementMgr
 
ReputationMgrm_reputationMgr
 
SpellCooldowns m_spellCooldowns
 
uint32 m_ChampioningFaction
 
InstanceTimeMap _instanceResetTimes
 
uint32 _pendingBindId
 
uint32 _pendingBindTimer
 
uint32 _activeCheats
 
uint32 healthBeforeDuel
 
uint32 manaBeforeDuel
 
bool m_isInstantFlightOn
 
uint32 m_flightSpellActivated
 
WorldLocation _corpseLocation
 
Optional< float > _farSightDistance = { }
 
bool _wasOutdoor
 
PlayerSettingMap m_charSettingsMap
 
Seconds m_creationTime
 

Friends

class WorldSession
 
class CinematicMgr
 
void Item::AddToUpdateQueueOf (Player *player)
 
void Item::RemoveFromUpdateQueueOf (Player *player)
 

Detailed Description

Member Typedef Documentation

◆ DFQuestsDoneList

typedef std::set<uint32> Player::DFQuestsDoneList

◆ ItemMap

typedef std::unordered_map<ObjectGuid::LowType, Item*> Player::ItemMap

◆ JoinedChannelsList

typedef std::list<Channel*> Player::JoinedChannelsList
protected

◆ QuestSet

typedef std::set<uint32> Player::QuestSet
protected

◆ RefundableItemsSet

◆ SeasonalEventQuestMap

typedef std::unordered_map<uint32, SeasonalQuestSet> Player::SeasonalEventQuestMap
protected

◆ SeasonalQuestSet

typedef std::set<uint32> Player::SeasonalQuestSet
protected

Constructor & Destructor Documentation

◆ Player()

Player::Player ( WorldSession session)
explicit
152 : Unit(true), m_mover(this)
153{
154#ifdef _MSC_VER
155#pragma warning(default:4355)
156#endif
157
160
162
163 m_session = session;
164
165 m_ingametime = 0;
166
167 m_ExtraFlags = 0;
168
169 m_spellModTakingSpell = nullptr;
170 //m_pad = 0;
171
172 // players always accept
174 SetAcceptWhispers(true);
175
179
180 m_regenTimer = 0;
184
187
188 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
189
190 m_areaUpdateId = 0;
192
193 m_needZoneUpdate = false;
194
198
200
201 memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
202
203 m_social = nullptr;
204
205 // group is initialized in the reference constructor
206 SetGroupInvite(nullptr);
209 m_bPassOnGroupLoot = false;
210
213
215
218
220 m_bMustDelayTeleport = false;
221 m_bHasDelayedTeleport = false;
223 m_canTeleport = false;
224 m_canKnockback = false;
225
226 m_trade = nullptr;
227
228 m_cinematic = 0;
229
232
233 m_DailyQuestChanged = false;
235
236 for (uint8 i = 0; i < MAX_TIMERS; i++)
238
241 m_isInWater = false;
242 m_drunkTimer = 0;
243 m_deathTimer = 0;
245
247
248 m_swingErrorMsg = 0;
249
250 for (uint8 j = 0; j < PLAYER_MAX_BATTLEGROUND_QUEUES; ++j)
251 {
253 _BgBattlegroundQueueID[j].invitedToInstance = 0;
254 }
255
262 m_canParry = false;
263 m_canBlock = false;
264 m_canTitanGrip = false;
265 m_ammoDPS = 0.0f;
266
268 //cache for UNIT_CREATED_BY_SPELL to allow
269 //returning reagents for temporarily removed pets
270 //when dying/logging out
271 m_oldpetspell = 0;
272 m_lastpetnumber = 0;
273
275 _restTime = 0;
276 _innTriggerId = 0;
277 _restBonus = 0;
278 _restFlagMask = 0;
280
281 m_mailsUpdated = false;
282 unReadMails = 0;
283 m_nextMailDelivereTime = time_t(0);
284
288
289 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
291
293
294 m_HomebindTimer = 0;
295 m_InstanceValid = true;
299
300 m_lastPotionId = 0;
301
302 m_activeSpec = 0;
303 m_specsCount = 1;
304
305 for (uint8 i = 0; i < MAX_TALENT_SPECS; ++i)
306 {
307 for (uint8 g = 0; g < MAX_GLYPH_SLOT_INDEX; ++g)
308 m_Glyphs[i][g] = 0;
309 }
310
311 for (uint8 i = 0; i < BASEMOD_END; ++i)
312 {
313 m_auraBaseMod[i][FLAT_MOD] = 0.0f;
314 m_auraBaseMod[i][PCT_MOD] = 1.0f;
315 }
316
317 for (uint8 i = 0; i < MAX_COMBAT_RATING; i++)
318 m_baseRatingValue[i] = 0;
319
321 m_baseFeralAP = 0;
322 m_baseManaRegen = 0;
325
326 // Honor System
328
329 m_IsBGRandomWinner = false;
330
331 // Player summoning
332 m_summon_expire = 0;
333 m_summon_mapid = 0;
334 m_summon_x = 0.0f;
335 m_summon_y = 0.0f;
336 m_summon_z = 0.0f;
337 m_summon_asSpectator = false;
338
339 //m_mover = this;
341 m_seer = this;
342
343 m_recallMap = 0;
344 m_recallX = 0;
345 m_recallY = 0;
346 m_recallZ = 0;
347 m_recallO = 0;
348
349 m_homebindMapId = 0;
351 m_homebindX = 0;
352 m_homebindY = 0;
353 m_homebindZ = 0;
354
356
357 m_declinedname = nullptr;
358
359 m_isActive = true;
360
361 m_runes = nullptr;
362
363 m_lastFallTime = 0;
364 m_lastFallZ = 0;
365
367
369
370 sWorldSessionMgr->IncreasePlayerCount();
371
373
374 for (uint8 i = 0; i < MAX_POWERS; ++i)
375 m_powerFraction[i] = 0;
376
377 isDebugAreaTriggers = false;
378
379 m_WeeklyQuestChanged = false;
380
381 m_MonthlyQuestChanged = false;
382
384
385 SetPendingBind(0, 0);
386
388
389 m_creationTime = 0s;
390
391 _cinematicMgr = new CinematicMgr(this);
392
394 m_reputationMgr = new ReputationMgr(this);
395
396 // Ours
397 m_NeedToSaveGlyphs = false;
398 m_MountBlockId = 0;
399 m_realDodge = 0.0f;
400 m_realParry = 0.0f;
403
405
406 for( int i = 0; i < NUM_CAI_SPELLS; ++i )
407 m_charmAISpells[i] = 0;
408
409 m_applyResilience = true;
410
411 m_isInstantFlightOn = true;
412
413 _wasOutdoor = true;
414 sScriptMgr->OnConstructPlayer(this);
415}
@ TYPEID_PLAYER
Definition: ObjectGuid.h:36
@ TYPEMASK_PLAYER
Definition: ObjectGuid.h:50
@ PLAYER_END
Definition: UpdateFields.h:392
@ FLAT_MOD
Definition: Unit.h:190
@ PCT_MOD
Definition: Unit.h:191
#define MAX_COMBAT_RATING
Definition: Unit.h:245
@ BASEMOD_END
Definition: Unit.h:185
#define MAX_MOVE_TYPE
Definition: UnitDefines.h:360
@ NUM_CAI_SPELLS
Definition: Player.h:931
@ CHEAT_NONE
Definition: Player.h:1004
@ BUYBACK_SLOT_START
Definition: Player.h:730
#define MAX_TIMERS
Definition: Player.h:584
#define DISABLED_MIRROR_TIMER
Definition: Player.h:585
@ PLAYED_TIME_TOTAL
Definition: Player.h:861
@ PLAYED_TIME_LEVEL
Definition: Player.h:862
@ UNDERWATER_NONE
Definition: Player.h:100
@ AT_LOGIN_NONE
Definition: Player.h:605
@ PLAYER_SLOTS_COUNT
Definition: Player.h:673
#define sWorldSessionMgr
Definition: WorldSessionMgr.h:110
@ CONFIG_INTERVAL_SAVE
Definition: IWorld.h:214
#define sScriptMgr
Definition: ScriptMgr.h:727
@ RAID_DIFFICULTY_10MAN_NORMAL
Definition: DBCEnums.h:273
@ DUNGEON_DIFFICULTY_NORMAL
Definition: DBCEnums.h:269
@ MAX_POWERS
Definition: SharedDefines.h:276
#define MAX_TALENT_SPECS
Definition: SharedDefines.h:675
#define MAX_GLYPH_SLOT_INDEX
Definition: SharedDefines.h:676
@ BATTLEGROUND_QUEUE_NONE
Definition: SharedDefines.h:3636
@ TEAM_NEUTRAL
Definition: SharedDefines.h:762
#define PLAYER_MAX_BATTLEGROUND_QUEUES
Definition: SharedDefines.h:176
std::uint8_t uint8
Definition: Define.h:109
std::uint32_t uint32
Definition: Define.h:107
#define sWorld
Definition: World.h:357
bool IsPlayerAccount(uint32 gmlevel)
Definition: AccountMgr.cpp:305
uint32 GetSecurity(uint32 accountId)
Definition: AccountMgr.cpp:238
Seconds GetGameTime()
Definition: GameTime.cpp:38
Definition: AchievementMgr.h:293
Definition: GossipDef.h:259
Definition: Item.h:220
uint16 m_objectType
Definition: Object.h:246
uint16 m_valuesCount
Definition: Object.h:260
TypeID m_objectTypeId
Definition: Object.h:248
bool m_isActive
Definition: Object.h:644
bool m_canParry
Definition: Player.h:2883
time_t m_summon_expire
Definition: Player.h:2919
bool m_needZoneUpdate
Definition: Player.h:2936
uint16 m_additionalSaveTimer
Definition: Player.h:2790
float m_ammoDPS
Definition: Player.h:2887
uint32 m_temporaryUnsummonedPetNumber
Definition: Player.h:2990
uint32 m_ChampioningFaction
Definition: Player.h:2998
bool m_bHasDelayedTeleport
Definition: Player.h:2983
bool m_InstanceValid
Definition: Player.h:2446
time_t m_deathExpireTime
Definition: Player.h:2879
ReputationMgr * m_reputationMgr
Definition: Player.h:2994
float m_auraBaseMod[BASEMOD_END][MOD_END]
Definition: Player.h:2834
float m_homebindZ
Definition: Player.h:2383
uint32 m_lastFallTime
Definition: Player.h:2967
uint32 m_lastPotionId
Definition: Player.h:2823
CinematicMgr * _cinematicMgr
Definition: Player.h:2946
bool m_canTeleport
Definition: Player.h:2984
uint32 m_usedTalentCount
Definition: Player.h:2900
friend class CinematicMgr
Definition: Player.h:1084
bool m_MonthlyQuestChanged
Definition: Player.h:2867
PlayerSocial * m_social
Definition: Player.h:2905
uint32 m_homebindMapId
Definition: Player.h:2379
Seconds m_creationTime
Definition: Player.h:3022
void SetAcceptWhispers(bool on)
Definition: Player.h:1175
float m_summon_z
Definition: Player.h:2923
time_t m_lastHonorUpdateTime
Definition: Player.h:2783
time_t _restTime
Definition: Player.h:2893
SafeUnitPointer m_mover
Definition: Player.h:2343
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2410
uint32 _activeCheats
Definition: Player.h:3004
uint32 m_resetTalentsCost
Definition: Player.h:2898
uint8 m_MirrorTimerFlags
Definition: Player.h:2971
uint32 m_atLoginFlags
Definition: Player.h:2798
uint32 m_ExtraFlags
Definition: Player.h:2806
float m_recallX
Definition: Player.h:2370
uint32 m_ingametime
Definition: Player.h:2713
float m_recallO
Definition: Player.h:2373
bool m_WeeklyQuestChanged
Definition: Player.h:2866
uint8 unReadMails
Definition: Player.h:1669
uint32 m_pendingSpectatorInviteInstanceId
Definition: Player.h:2598
void SetGroupInvite(Group *group)
Definition: Player.h:2477
uint32 m_DelayedOperations
Definition: Player.h:2981
TradeData * m_trade
Definition: Player.h:2863
float m_realParry
Definition: Player.h:2669
uint32 m_nextSave
Definition: Player.h:2789
uint32 m_zoneUpdateTimer
Definition: Player.h:2875
bool m_mailsUpdated
Definition: Player.h:1605
time_t mSemaphoreTeleport_Far
Definition: Player.h:2979
float _restBonus
Definition: Player.h:2895
uint32 m_foodEmoteTimerCount
Definition: Player.h:2675
uint32 m_baseFeralAP
Definition: Player.h:2837
float m_summon_y
Definition: Player.h:2922
WorldObject * m_seer
Definition: Player.h:2344
float m_summon_x
Definition: Player.h:2921
uint32 m_charmAISpells[NUM_CAI_SPELLS]
Definition: Player.h:2671
uint8 m_additionalSaveMask
Definition: Player.h:2791
bool m_bMustDelayTeleport
Definition: Player.h:2982
bool m_SeasonalQuestChanged
Definition: Player.h:2868
TeamId m_team
Definition: Player.h:2788
uint32 m_areaUpdateId
Definition: Player.h:2876
uint8 m_specsCount
Definition: Player.h:2828
uint32 m_extraBonusTalentCount
Definition: Player.h:2902
WorldSession * GetSession() const
Definition: Player.h:2007
float m_powerFraction[MAX_POWERS]
Definition: Player.h:2676
uint32 m_oldpetspell
Definition: Player.h:2991
Runes * m_runes
Definition: Player.h:2927
uint32 m_currentBuybackSlot
Definition: Player.h:2801
uint32 m_deathTimer
Definition: Player.h:2878
uint32 m_regenTimerCount
Definition: Player.h:2674
AchievementMgr * m_achievementMgr
Definition: Player.h:2993
uint8 m_swingErrorMsg
Definition: Player.h:2886
time_t m_nextMailDelivereTime
Definition: Player.h:1670
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES > _BgBattlegroundQueueID
Definition: Player.h:2689
void clearResurrectRequestData()
Definition: Player.h:1834
bool m_bPassOnGroupLoot
Definition: Player.h:2913
float m_recallZ
Definition: Player.h:2372
uint32 m_pendingSpectatorForBG
Definition: Player.h:2597
bool m_DailyQuestChanged
Definition: Player.h:2865
uint32 m_Glyphs[MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
Definition: Player.h:2830
Difficulty m_dungeonDifficulty
Definition: Player.h:2794
uint32 m_weaponChangeTimer
Definition: Player.h:2872
uint32 m_WeaponProficiency
Definition: Player.h:2881
float m_realDodge
Definition: Player.h:2668
bool m_canKnockback
Definition: Player.h:2985
bool m_isInstantFlightOn
Definition: Player.h:3010
time_t mSemaphoreTeleport_Near
Definition: Player.h:2978
DeclinedName * m_declinedname
Definition: Player.h:2926
bool m_IsBGRandomWinner
Definition: Player.h:2691
uint32 m_drunkTimer
Definition: Player.h:2871
uint32 m_contestedPvPTimer
Definition: Player.h:2677
float m_homebindY
Definition: Player.h:2382
uint32 m_Played_time[MAX_PLAYED_TIME_INDEX]
Definition: Player.h:1203
uint32 m_baseSpellPower
Definition: Player.h:2836
bool _wasOutdoor
Definition: Player.h:3018
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
Definition: Player.h:2448
uint32 _restFlagMask
Definition: Player.h:2896
uint8 m_grantableLevels
Definition: Player.h:2934
Item * m_items[PLAYER_SLOTS_COUNT]
Definition: Player.h:2800
uint16 m_homebindAreaId
Definition: Player.h:2380
Difficulty m_raidMapDifficulty
Definition: Player.h:2796
uint32 m_zoneUpdateId
Definition: Player.h:2874
bool m_isInWater
Definition: Player.h:2973
uint8 m_MirrorTimerFlagsLast
Definition: Player.h:2972
time_t m_lastDailyQuestTime
Definition: Player.h:2869
time_t m_resetTalentsTime
Definition: Player.h:2899
uint32 m_baseHealthRegen
Definition: Player.h:2839
uint32 m_charmUpdateTimer
Definition: Player.h:2609
uint32 m_summon_mapid
Definition: Player.h:2920
Difficulty m_raidDifficulty
Definition: Player.h:2795
float m_lastFallZ
Definition: Player.h:2968
bool m_summon_asSpectator
Definition: Player.h:2924
uint32 m_baseManaRegen
Definition: Player.h:2838
time_t m_logintime
Definition: Player.h:1201
int32 m_MirrorTimer[MAX_TIMERS]
Definition: Player.h:2970
uint32 _innTriggerId
Definition: Player.h:2894
uint32 m_ArenaTeamIdInvited
Definition: Player.h:2818
uint32 m_recallMap
Definition: Player.h:2369
float m_recallY
Definition: Player.h:2371
uint32 m_questRewardTalentCount
Definition: Player.h:2901
bool m_NeedToSaveGlyphs
Definition: Player.h:2664
uint32 m_HomebindTimer
Definition: Player.h:2445
uint64 m_auraRaidUpdateMask
Definition: Player.h:2912
bool m_canTitanGrip
Definition: Player.h:2885
bool m_canBlock
Definition: Player.h:2884
uint8 m_cinematic
Definition: Player.h:2861
int32 m_spellPenetrationItemMod
Definition: Player.h:2840
uint8 m_activeSpec
Definition: Player.h:2827
WorldSession * m_session
Definition: Player.h:2856
uint32 m_flightSpellActivated
Definition: Player.h:3012
uint32 teleportStore_options
Definition: Player.h:2977
int32 m_baseRatingValue[MAX_COMBAT_RATING]
Definition: Player.h:2835
uint32 m_ArmorProficiency
Definition: Player.h:2882
bool isDebugAreaTriggers
Definition: Player.h:2566
uint32 m_groupUpdateMask
Definition: Player.h:2911
Spell * m_spellModTakingSpell
Definition: Player.h:2562
uint32 m_lastpetnumber
Definition: Player.h:2916
time_t m_Last_tick
Definition: Player.h:1202
PlayerMenu * PlayerTalkClass
Definition: Player.h:2249
uint32 m_GuildIdInvited
Definition: Player.h:2817
float m_homebindX
Definition: Player.h:2381
uint16 m_hostileReferenceCheckTimer
Definition: Player.h:2792
bool m_itemUpdateQueueBlocked
Definition: Player.h:2804
uint32 m_MountBlockId
Definition: Player.h:2666
Definition: Unit.h:620
int32 m_regenTimer
Definition: Unit.h:2095
bool m_ControlledByPlayer
Definition: Unit.h:2005
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1982
bool m_applyResilience
Definition: Unit.h:2108
void Initialize(Unit *defVal)
Definition: UnitUtils.h:51
Definition: ReputationMgr.h:57

References _activeCheats, _BgBattlegroundQueueID, _cinematicMgr, _innTriggerId, _restBonus, _restFlagMask, _restTime, _wasOutdoor, AT_LOGIN_NONE, BASEMOD_END, BATTLEGROUND_QUEUE_NONE, BUYBACK_SLOT_START, CHEAT_NONE, CinematicMgr, clearResurrectRequestData(), CONFIG_INTERVAL_SAVE, DISABLED_MIRROR_TIMER, DUNGEON_DIFFICULTY_NORMAL, FLAT_MOD, GameTime::GetGameTime(), GetSession(), SafeUnitPointer::Initialize(), isDebugAreaTriggers, AccountMgr::IsPlayerAccount(), m_achievementMgr, m_activeSpec, m_additionalSaveMask, m_additionalSaveTimer, m_ammoDPS, Unit::m_applyResilience, m_areaUpdateId, m_ArenaTeamIdInvited, m_ArmorProficiency, m_atLoginFlags, m_auraBaseMod, m_auraRaidUpdateMask, m_baseFeralAP, m_baseHealthRegen, m_baseManaRegen, m_baseRatingValue, m_baseSpellPower, m_bHasDelayedTeleport, m_bMustDelayTeleport, m_bPassOnGroupLoot, m_canBlock, m_canKnockback, m_canParry, m_canTeleport, m_canTitanGrip, m_ChampioningFaction, m_charmAISpells, m_charmUpdateTimer, m_cinematic, m_contestedPvPTimer, Unit::m_ControlledByPlayer, m_creationTime, m_currentBuybackSlot, m_DailyQuestChanged, m_deathExpireTime, m_deathTimer, m_declinedname, m_DelayedOperations, m_drunkTimer, m_dungeonDifficulty, m_extraBonusTalentCount, m_ExtraFlags, m_flightSpellActivated, m_foodEmoteTimerCount, m_forced_speed_changes, m_Glyphs, m_grantableLevels, m_groupUpdateMask, m_GuildIdInvited, m_homebindAreaId, m_homebindMapId, m_HomebindTimer, m_homebindX, m_homebindY, m_homebindZ, m_hostileReferenceCheckTimer, m_ingametime, m_InstanceValid, WorldObject::m_isActive, m_IsBGRandomWinner, m_isInstantFlightOn, m_isInWater, m_items, m_itemUpdateQueueBlocked, m_Last_tick, m_lastDailyQuestTime, m_lastFallTime, m_lastFallZ, m_lastHonorUpdateTime, m_lastpetnumber, m_lastPotionId, m_logintime, m_mailsUpdated, m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, m_MonthlyQuestChanged, m_MountBlockId, Unit::m_movedByPlayer, m_NeedToSaveGlyphs, m_needZoneUpdate, m_nextMailDelivereTime, m_nextSave, Object::m_objectType, Object::m_objectTypeId, m_oldpetspell, m_pendingSpectatorForBG, m_pendingSpectatorInviteInstanceId, m_Played_time, m_powerFraction, m_questRewardTalentCount, m_raidDifficulty, m_raidMapDifficulty, m_realDodge, m_realParry, m_recallMap, m_recallO, m_recallX, m_recallY, m_recallZ, Unit::m_regenTimer, m_regenTimerCount, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_runes, m_SeasonalQuestChanged, m_seer, m_session, m_social, m_specsCount, m_spellModTakingSpell, m_spellPenetrationItemMod, m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, m_swingErrorMsg, m_team, m_temporaryUnsummonedPetNumber, m_trade, m_usedTalentCount, Object::m_valuesCount, m_weaponChangeTimer, m_WeaponProficiency, m_WeeklyQuestChanged, m_zoneUpdateId, m_zoneUpdateTimer, MAX_COMBAT_RATING, MAX_GLYPH_SLOT_INDEX, MAX_MOVE_TYPE, MAX_POWERS, MAX_TALENT_SPECS, MAX_TIMERS, mSemaphoreTeleport_Far, mSemaphoreTeleport_Near, NUM_CAI_SPELLS, PCT_MOD, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_END, PLAYER_MAX_BATTLEGROUND_QUEUES, PLAYER_SLOTS_COUNT, PlayerTalkClass, RAID_DIFFICULTY_10MAN_NORMAL, SetAcceptWhispers(), SetGroupInvite(), SetPendingBind(), sScriptMgr, sWorld, sWorldSessionMgr, TEAM_NEUTRAL, teleportStore_options, TYPEID_PLAYER, TYPEMASK_PLAYER, UNDERWATER_NONE, and unReadMails.

◆ ~Player()

Player::~Player ( )
override
418{
419 sScriptMgr->OnDestructPlayer(this);
420
421 // it must be unloaded already in PlayerLogout and accessed only for loggined player
422 //m_social = nullptr;
423
424 // Note: buy back item already deleted from DB when player was saved
425 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; ++i)
426 delete m_items[i];
427
428 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
429 delete itr->second;
430
431 for (PlayerTalentMap::const_iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
432 delete itr->second;
433
434 //all mailed items should be deleted, also all mail should be deallocated
435 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
436 {
437 delete *itr;
438 }
439
440 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
441 delete iter->second; //if item is duplicated... then server may crash ... but that item should be deallocated
442
443 delete PlayerTalkClass;
444
445 for (std::size_t x = 0; x < ItemSetEff.size(); x++)
446 delete ItemSetEff[x];
447
448 delete m_declinedname;
449 delete m_runes;
450 delete m_achievementMgr;
451 delete m_reputationMgr;
452 delete _cinematicMgr;
453
454 sWorldSessionMgr->DecreasePlayerCount();
455
456 if (!m_isInSharedVisionOf.empty())
457 {
458 do
459 {
460 Unit* u = *(m_isInSharedVisionOf.begin());
461 u->RemovePlayerFromVision(this);
462 } while (!m_isInSharedVisionOf.empty());
463 }
464}
ItemMap mMitems
Definition: Player.h:1674
PlayerSpellMap m_spells
Definition: Player.h:2821
std::vector< ItemSetEffect * > ItemSetEff
Definition: Player.h:2250
PlayerMails m_mail
Definition: Player.h:2820
PlayerTalentMap m_talents
Definition: Player.h:2822
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2345
void RemovePlayerFromVision(Player *player)
Definition: Unit.cpp:11225

References _cinematicMgr, ItemSetEff, m_achievementMgr, m_declinedname, m_isInSharedVisionOf, m_items, m_mail, m_reputationMgr, m_runes, m_spells, m_talents, mMitems, PLAYER_SLOTS_COUNT, PlayerTalkClass, Unit::RemovePlayerFromVision(), sScriptMgr, and sWorldSessionMgr.

Member Function Documentation

◆ _addSpell()

bool Player::_addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  temporary,
bool  learnFromSkill = false 
)
Todo:
confirm if rogues start wth lockpicking skill at level 1 but only recieve the spell to use it at level 16
3104{
3105 // pussywizard: this can be called to OVERWRITE currently existing spell params! usually to set active = false for lower ranks of a spell
3106
3107 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3108 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, false))
3109 return false;
3110
3111 // pussywizard: already found and temporary, nothing to do
3112 PlayerSpellMap::iterator itr = m_spells.find(spellId);
3113 if (itr != m_spells.end() && itr->second->State == PLAYERSPELL_TEMPORARY)
3114 return false;
3115
3116 // xinef: send packet so client can properly recognize this new spell
3117 // xinef: ignore passive spells and spells with learn effect
3118 // xinef: send spells with no aura effects (ie dual wield)
3119 if (IsInWorld() && !isBeingLoaded() && temporary && !learnFromSkill && (!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3120 SendLearnPacket(spellInfo->Id, true);
3121
3122 // xinef: DO NOT allow to learn spell with effect learn spell!
3123 // xinef: if spell possess spell learn effects only, learn those spells as temporary (eg. Metamorphosis, Tree of Life)
3124 if (temporary && spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3125 {
3126 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3127 if (spellInfo->Effects[i].IsEffect())
3128 {
3129 if (spellInfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
3130 {
3131 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN: {}, PLAYER: {}", spellId, GetGUID().ToString());
3132 return false;
3133 //ABORT();
3134 }
3135 else if (SpellInfo const* learnSpell = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
3137 }
3138
3139 return false;
3140 }
3141
3142 if (itr != m_spells.end()) // pussywizard: already know this spell, so update information
3143 {
3144 // pussywizard: do nothing if already set as wanted
3145 if (itr->second->State != PLAYERSPELL_REMOVED && (itr->second->specMask & addSpecMask) == addSpecMask)
3146 return false;
3147
3148 // pussywizard: need cast auras, learn linked spells, do professions stuff, etc.
3149 // pussywizard: but only for spells that are really added (inactive -> active OR added to current spec)
3150 bool spellIsNew = true;
3151
3152 // pussywizard: present in m_spells, not removed, already in current spec, already active
3153 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec))
3154 spellIsNew = false;
3155
3156 // pussywizard: update info in m_spells
3157 if (itr->second->State != PLAYERSPELL_NEW && (itr->second->specMask & addSpecMask) != addSpecMask)
3158 itr->second->State = PLAYERSPELL_CHANGED;
3159 itr->second->Active = true;
3160 itr->second->specMask |= addSpecMask;
3161
3162 if (!spellIsNew)
3163 return true;
3164 }
3165 else // pussywizard: not found in m_spells
3166 {
3167 PlayerSpell* newspell = new PlayerSpell;
3168 newspell->Active = true;
3170 newspell->specMask = addSpecMask;
3171
3172 m_spells[spellId] = newspell;
3173 }
3174
3175 // pussywizard: return if spell not in current spec
3176 // pussywizard: return true to fix active for ranks, this condition is true only at loading, so no problems with learning packets
3177 if (!((1 << GetActiveSpec()) & addSpecMask))
3178 return true;
3179
3180 // xinef: do not add spells with effect learn spell
3181 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3182 {
3183 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN 2: {}, PLAYER: {}", spellId, GetGUID().ToString());
3184 m_spells.erase(spellInfo->Id); // mem leak, but should never happen
3185 return false;
3186 //ABORT();
3187 }
3188 // pussywizard: cast passive spells (including all talents without SPELL_EFFECT_LEARN_SPELL) with additional checks
3189 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3190 {
3191 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3192 CastSpell(this, spellId, true);
3193 }
3194 // pussywizard: cast and return, learnt spells will update profession count, etc.
3195 else if (spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP))
3196 {
3197 CastSpell(this, spellId, true);
3198 return false;
3199 }
3200
3201 // xinef: unapply aura stats if dont meet requirements
3202 // xinef: handle only if player is not loaded, loading is handled in loadfromdb
3203 if (!isBeingLoaded())
3204 if (Aura* aura = GetAura(spellId))
3205 {
3206 if (aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_35_PERCENT ||
3207 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTH_ABOVE_75_PERCENT ||
3208 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_20_PERCENT )
3209 if (!HasAuraState((AuraStateType)aura->GetSpellInfo()->CasterAuraState))
3210 aura->HandleAllEffects(aura->GetApplicationOfTarget(GetGUID()), AURA_EFFECT_HANDLE_REAL, false);
3211 }
3212
3213 // pussywizard: update free primary prof points
3214 if (uint32 freeProfs = GetFreePrimaryProfessionPoints())
3215 {
3216 if (spellInfo->IsPrimaryProfessionFirstRank())
3217 SetFreePrimaryProfessions(freeProfs - 1);
3218 }
3219
3220 uint16 maxskill = GetMaxSkillValueForLevel();
3221 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spellId);
3222 SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId);
3223 // xinef: set appropriate skill value
3224 if (spellLearnSkill)
3225 {
3226 uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
3227 uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill);
3228 uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue;
3229
3230 if (skill_value < spellLearnSkill->value)
3231 skill_value = spellLearnSkill->value;
3232 if (skill_max_value < new_skill_max_value)
3233 skill_max_value = new_skill_max_value;
3234
3235 SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value);
3236 }
3237 else
3238 {
3239 // not ranked skills
3240 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3241 {
3242 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3243 if (!pSkill)
3244 {
3245 continue;
3246 }
3247
3249 // Added for runeforging, it is confirmed via sniff that this happens when death knights learn the spell, not on character creation.
3250 if ((_spell_idx->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id)) || ((pSkill->id == SKILL_LOCKPICKING || pSkill->id == SKILL_RUNEFORGING) && _spell_idx->second->TrivialSkillLineRankHigh == 0))
3251 {
3252 LearnDefaultSkill(pSkill->id, 0);
3253 }
3254
3255 if (pSkill->id == SKILL_MOUNTS && !Has310Flyer(false))
3256 {
3257 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3258 {
3259 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3260 {
3261 SetHas310Flyer(true);
3262 }
3263 }
3264 }
3265 }
3266 }
3267
3268 // xinef: update achievement criteria
3269 if (!GetSession()->PlayerLoading())
3270 {
3271 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3272 {
3275 }
3277 }
3278
3279 return true;
3280}
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
#define SPEC_MASK_ALL
Definition: Player.h:177
@ PLAYERSPELL_REMOVED
Definition: Player.h:122
@ PLAYERSPELL_UNCHANGED
Definition: Player.h:119
@ PLAYERSPELL_CHANGED
Definition: Player.h:120
@ PLAYERSPELL_NEW
Definition: Player.h:121
@ PLAYERSPELL_TEMPORARY
Definition: Player.h:123
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition: SpellAuraDefines.h:270
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
#define sSpellMgr
Definition: SpellMgr.h:825
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition: SpellMgr.h:584
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN
Definition: DBCEnums.h:361
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL
Definition: DBCEnums.h:148
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS
Definition: DBCEnums.h:185
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE
Definition: DBCEnums.h:218
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1638
@ SPELL_EFFECT_LEARN_SPELL
Definition: SharedDefines.h:814
@ SPELL_EFFECT_SKILL_STEP
Definition: SharedDefines.h:822
SpellAttr0
Definition: SharedDefines.h:381
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:388
@ SPELL_ATTR0_DO_NOT_DISPLAY
Definition: SharedDefines.h:389
AuraStateType
Definition: SharedDefines.h:1288
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1305
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1315
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1293
@ SKILL_RUNEFORGING
Definition: SharedDefines.h:3004
@ SKILL_LOCKPICKING
Definition: SharedDefines.h:2975
@ SKILL_MOUNTS
Definition: SharedDefines.h:3005
#define LOG_INFO(filterType__,...)
Definition: Log.h:165
std::uint16_t uint16
Definition: Define.h:108
bool IsInWorld() const
Definition: Object.h:108
ObjectGuid GetGUID() const
Definition: Object.h:114
std::string ToString() const
Definition: Position.cpp:52
Definition: Player.h:127
PlayerSpellState State
Definition: Player.h:128
bool Active
Definition: Player.h:129
uint8 specMask
Definition: Player.h:130
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2177
bool _addSpell(uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
Definition: Player.cpp:3103
void learnSpell(uint32 spellId, bool temporary=false, bool learnFromSkill=false)
Definition: Player.cpp:3291
void LearnDefaultSkill(uint32 skillId, uint16 rank)
Definition: Player.cpp:11825
bool isBeingLoaded() const override
Definition: PlayerStorage.cpp:4913
void SendLearnPacket(uint32 spellId, bool learn)
Definition: Player.cpp:3039
uint16 GetMaxSkillValueForLevel() const
Definition: Player.cpp:16179
bool IsNeedCastPassiveSpellAtLearn(SpellInfo const *spellInfo) const
Definition: Player.cpp:3282
uint16 GetPureSkillValue(uint32 skill) const
Definition: Player.cpp:5523
bool HasSkill(uint32 skill) const
Definition: Player.cpp:5437
uint16 GetPureMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5493
void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
Definition: Player.cpp:5337
bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId=0)
Definition: Player.cpp:3485
uint8 GetActiveSpec() const
Definition: Player.h:1749
void SetHas310Flyer(bool on)
Definition: Player.h:1185
void SetFreePrimaryProfessions(uint16 profs)
Definition: Player.h:1778
uint32 GetFreePrimaryProfessionPoints() const
Definition: Player.h:1777
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5614
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10591
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1179
Definition: SpellAuras.h:87
Definition: SpellInfo.h:316
uint32 Stances
Definition: SpellInfo.h:333
bool IsPassive() const
Definition: SpellInfo.cpp:1098
uint32 Id
Definition: SpellInfo.h:320
bool HasAnyAura() const
Definition: SpellInfo.cpp:901
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:415
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:393
bool IsPrimaryProfessionFirstRank() const
Definition: SpellInfo.cpp:983
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:876
Definition: SpellMgr.h:574
uint16 value
Definition: SpellMgr.h:577
uint16 step
Definition: SpellMgr.h:576
uint16 maxvalue
Definition: SpellMgr.h:578
uint16 skill
Definition: SpellMgr.h:575
static bool CheckSpellValid(SpellInfo const *spellInfo, uint32 spellId, bool isTalent)
Definition: SpellMgr.cpp:459
Definition: DBCStructure.h:1584
uint32 id
Definition: DBCStructure.h:1585

References _addSpell(), ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, PlayerSpell::Active, AURA_EFFECT_HANDLE_REAL, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Unit::CastSpell(), SpellMgr::CheckSpellValid(), SpellInfo::Effects, GetActiveSpec(), Unit::GetAura(), GetFreePrimaryProfessionPoints(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetSession(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), Unit::HasAuraState(), SpellInfo::HasEffect(), HasSkill(), SpellInfo::Id, SkillLineEntry::id, isBeingLoaded(), Object::IsInWorld(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), SpellInfo::IsPrimaryProfessionFirstRank(), LearnDefaultSkill(), learnSpell(), LOG_INFO, m_activeSpec, m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, SendLearnPacket(), SetFreePrimaryProfessions(), SetHas310Flyer(), SetSkill(), SpellLearnSkillNode::skill, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LOCKPICKING, SKILL_MOUNTS, SKILL_RUNEFORGING, SPEC_MASK_ALL, PlayerSpell::specMask, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_SKILL_STEP, sSkillLineStore, sSpellMgr, SpellInfo::Stances, PlayerSpell::State, SpellLearnSkillNode::step, Position::ToString(), UpdateAchievementCriteria(), and SpellLearnSkillNode::value.

Referenced by _addSpell(), _addTalentAurasAndSpells(), addSpell(), AuraEffect::HandleAuraModShapeshift(), and AuraEffect::HandleAuraOverrideSpells().

◆ _AddSpellCooldown()

void Player::_AddSpellCooldown ( uint32  spell_id,
uint16  categoryId,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
11015{
11016 SpellCooldown sc;
11017 sc.end = GameTime::GetGameTimeMS().count() + end_time;
11018 sc.category = categoryId;
11019 sc.itemid = itemid;
11020 sc.maxduration = end_time;
11021 sc.sendToSpectator = false;
11022 sc.needSendToClient = needSendToClient;
11023
11025 {
11026 if (NeedSendSpectatorData() && forceSendToSpectator && (itemid || HasActiveSpell(spellid)))
11027 {
11028 sc.sendToSpectator = true;
11029 ArenaSpectator::SendCommand_Cooldown(FindMap(), GetGUID(), "ACD", spellid, end_time / IN_MILLISECONDS, end_time / IN_MILLISECONDS);
11030 }
11031 }
11032
11033 m_spellCooldowns[spellid] = std::move(sc);
11034}
#define SPECTATOR_COOLDOWN_MAX
Definition: ArenaSpectator.h:37
#define SPECTATOR_COOLDOWN_MIN
Definition: ArenaSpectator.h:36
constexpr auto IN_MILLISECONDS
Definition: Common.h:53
void SendCommand_Cooldown(T *o, ObjectGuid targetGUID, const char *prefix, uint32 id, uint32 dur, uint32 maxdur)
Definition: ArenaSpectator.h:89
Milliseconds GetGameTimeMS()
Definition: GameTime.cpp:43
Map * FindMap() const
Definition: Object.h:538
Definition: Player.h:200
uint32 itemid
Definition: Player.h:203
bool sendToSpectator
Definition: Player.h:205
bool needSendToClient
Definition: Player.h:206
uint32 end
Definition: Player.h:201
uint32 maxduration
Definition: Player.h:204
uint16 category
Definition: Player.h:202
bool NeedSendSpectatorData() const
Definition: Player.cpp:15342
bool HasActiveSpell(uint32 spell) const
Definition: Player.cpp:3891
SpellCooldowns m_spellCooldowns
Definition: Player.h:2996

References SpellCooldown::category, SpellCooldown::end, WorldObject::FindMap(), GameTime::GetGameTimeMS(), Object::GetGUID(), HasActiveSpell(), IN_MILLISECONDS, SpellCooldown::itemid, m_spellCooldowns, SpellCooldown::maxduration, NeedSendSpectatorData(), SpellCooldown::needSendToClient, ArenaSpectator::SendCommand_Cooldown(), SpellCooldown::sendToSpectator, SPECTATOR_COOLDOWN_MAX, and SPECTATOR_COOLDOWN_MIN.

Referenced by _LoadSpellCooldowns(), AddSpellAndCategoryCooldowns(), and AddSpellCooldown().

◆ _addTalentAurasAndSpells()

void Player::_addTalentAurasAndSpells ( uint32  spellId)
3023{
3024 // pussywizard: spells learnt from talents are added as TEMPORARY, so not saved to db (only the talent itself is saved)
3025 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3026 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3027 {
3028 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3029 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && !sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3030 _addSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
3031 }
3032 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3033 {
3034 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3035 CastSpell(this, spellId, true);
3036 }
3037}

References _addSpell(), Unit::CastSpell(), SpellInfo::Effects, SpellInfo::HasAttribute(), SpellInfo::HasEffect(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), MAX_SPELL_EFFECTS, SPEC_MASK_ALL, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, and SpellInfo::Stances.

Referenced by ActivateSpec(), and addTalent().

◆ _ApplyAllItemMods()

void Player::_ApplyAllItemMods ( )
7563{
7564 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods start.");
7565
7566 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7567 {
7568 if (m_items[i])
7569 {
7570 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7571 continue;
7572
7573 ItemTemplate const* proto = m_items[i]->GetTemplate();
7574 if (!proto)
7575 continue;
7576
7577 uint32 attacktype = Player::GetAttackBySlot(i);
7578 if (attacktype < MAX_ATTACK)
7580
7581 _ApplyItemBonuses(proto, i, true);
7582
7583 if (i == EQUIPMENT_SLOT_RANGED)
7585 }
7586 }
7587
7588 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7589 {
7590 if (m_items[i])
7591 {
7592 ItemTemplate const* proto = m_items[i]->GetTemplate();
7593 if (!proto)
7594 continue;
7595
7596 // item set bonuses not dependent from item broken state
7597 if (proto->ItemSet)
7598 AddItemsSetItem(this, m_items[i]);
7599
7600 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7601 continue;
7602
7603 ApplyItemEquipSpell(m_items[i], true);
7604 ApplyEnchantment(m_items[i], true);
7605 }
7606 }
7607
7608 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods complete.");
7609}
WeaponAttackType
Definition: Unit.h:209
@ MAX_ATTACK
Definition: Unit.h:213
void AddItemsSetItem(Player *player, Item *item)
Definition: Item.cpp:32
@ INVENTORY_SLOT_BAG_END
Definition: Player.h:706
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:698
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:169
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:544
Definition: ItemTemplate.h:619
uint32 ItemSet
Definition: ItemTemplate.h:675
void _ApplyAmmoBonuses()
Definition: Player.cpp:7629
void ApplyItemEquipSpell(Item *item, bool apply, bool form_change=false)
Definition: Player.cpp:7119
void ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
Definition: PlayerStorage.cpp:4304
void _ApplyItemBonuses(ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
Definition: Player.cpp:6613
void _ApplyWeaponDependentAuraMods(Item *item, WeaponAttackType attackType, bool apply)
Definition: Player.cpp:7015
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:542
bool CanUseAttackType(uint8 attacktype) const
Definition: Unit.h:929

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), AddItemsSetItem(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, and MAX_ATTACK.

Referenced by _ApplyAllStatBonuses(), and _LoadInventory().

◆ _ApplyAllLevelScaleItemMods()

void Player::_ApplyAllLevelScaleItemMods ( bool  apply)
7612{
7613 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7614 {
7615 if (m_items[i])
7616 {
7617 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7618 continue;
7619
7620 ItemTemplate const* proto = m_items[i]->GetTemplate();
7621 if (!proto)
7622 continue;
7623
7624 _ApplyItemMods(m_items[i], i, apply);
7625 }
7626 }
7627}
void _ApplyItemMods(Item *item, uint8 slot, bool apply)
Definition: Player.cpp:6578

References _ApplyItemMods(), Unit::CanUseAttackType(), GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, and m_items.

Referenced by GiveLevel(), and reset_commandscript::HandleResetLevelCommand().

◆ _ApplyAllStatBonuses()

void Player::_ApplyAllStatBonuses ( )
992{
993 SetCanModifyStats(false);
994
997
998 SetCanModifyStats(true);
999
1001}
void _ApplyAllItemMods()
Definition: Player.cpp:7562
bool UpdateAllStats() override
Definition: StatSystem.cpp:188
void _ApplyAllAuraStatMods()
Definition: Unit.cpp:5521
void SetCanModifyStats(bool modifyStats)
Definition: Unit.h:1017

References Unit::_ApplyAllAuraStatMods(), _ApplyAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _ApplyAmmoBonuses()

void Player::_ApplyAmmoBonuses ( )
7630{
7631 // check ammo
7633 if (!ammo_id)
7634 return;
7635
7636 float currentAmmoDPS;
7637
7638 ItemTemplate const* ammo_proto = sObjectMgr->GetItemTemplate(ammo_id);
7639 if (!ammo_proto || ammo_proto->Class != ITEM_CLASS_PROJECTILE || !CheckAmmoCompatibility(ammo_proto))
7640 currentAmmoDPS = 0.0f;
7641 else
7642 currentAmmoDPS = (ammo_proto->Damage[0].DamageMin + ammo_proto->Damage[0].DamageMax) / 2;
7643
7644 sScriptMgr->OnPlayerApplyAmmoBonuses(this, ammo_proto, currentAmmoDPS);
7645
7646 if (currentAmmoDPS == GetAmmoDPS())
7647 return;
7648
7649 m_ammoDPS = currentAmmoDPS;
7650
7651 if (CanModifyStats())
7653}
@ PLAYER_AMMO_ID
Definition: UpdateFields.h:369
@ RANGED_ATTACK
Definition: Unit.h:212
@ ITEM_CLASS_PROJECTILE
Definition: ItemTemplate.h:297
#define sObjectMgr
Definition: ObjectMgr.h:1650
float DamageMin
Definition: ItemTemplate.h:579
float DamageMax
Definition: ItemTemplate.h:580
_Damage Damage[MAX_ITEM_PROTO_DAMAGES]
Definition: ItemTemplate.h:651
uint32 Class
Definition: ItemTemplate.h:621
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:305
bool CheckAmmoCompatibility(ItemTemplate const *ammo_proto) const
Definition: Player.cpp:7655
float GetAmmoDPS() const
Definition: Player.h:1340
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
bool CanModifyStats() const
Definition: Unit.h:1018

References Unit::CanModifyStats(), CheckAmmoCompatibility(), ItemTemplate::Class, ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, GetAmmoDPS(), Object::GetUInt32Value(), ITEM_CLASS_PROJECTILE, m_ammoDPS, PLAYER_AMMO_ID, RANGED_ATTACK, sObjectMgr, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and SetAmmo().

◆ _ApplyItemBonuses()

void Player::_ApplyItemBonuses ( ItemTemplate const *  proto,
uint8  slot,
bool  apply,
bool  only_level_scale = false 
)
Deprecated:
item mods
6614{
6615 if (slot >= INVENTORY_SLOT_BAG_END || !proto)
6616 return;
6617
6618 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6619 if (only_level_scale && !ssd)
6620 return;
6621
6622 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6623 uint32 ssd_level = GetLevel();
6624 uint32 CustomScalingStatValue = 0;
6625
6626 sScriptMgr->OnPlayerCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6627
6628 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6629
6630 if (ssd && ssd_level > ssd->MaxLevel)
6631 ssd_level = ssd->MaxLevel;
6632
6633 ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6634 if (only_level_scale && !ssv)
6635 return;
6636
6637 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
6638 {
6639 uint32 statType = 0;
6640 int32 val = 0;
6641 // If set ScalingStatDistribution need get stats and values from it
6642 if (ssv)
6643 {
6644 if (ssd)
6645 {
6646 if (ssd->StatMod[i] < 0)
6647 continue;
6648
6649 statType = ssd->StatMod[i];
6650 val = (ssv->getssdMultiplier(ScalingStatValue) * ssd->Modifier[i]) / 10000;
6651 }
6652 else
6653 {
6654 if (i >= proto->StatsCount)
6655 continue;
6656
6657 // OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv)
6658 sScriptMgr->OnPlayerCustomScalingStatValue(this, proto, statType, val, i, ScalingStatValue, ssv);
6659 }
6660 }
6661 else
6662 {
6663 if (i >= proto->StatsCount)
6664 continue;
6665
6666 statType = proto->ItemStat[i].ItemStatType;
6667 val = proto->ItemStat[i].ItemStatValue;
6668
6669 sScriptMgr->OnPlayerApplyItemModsBefore(this, slot, apply, i, statType, val);
6670 }
6671
6672 if (val == 0)
6673 continue;
6674
6675 switch (statType)
6676 {
6677 case ITEM_MOD_MANA:
6678 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
6679 break;
6680 case ITEM_MOD_HEALTH: // modify HP
6681 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(val), apply);
6682 break;
6683 case ITEM_MOD_AGILITY: // modify agility
6685 ApplyStatBuffMod(STAT_AGILITY, float(val), apply);
6686 break;
6687 case ITEM_MOD_STRENGTH: //modify strength
6689 ApplyStatBuffMod(STAT_STRENGTH, float(val), apply);
6690 break;
6691 case ITEM_MOD_INTELLECT: //modify intellect
6693 ApplyStatBuffMod(STAT_INTELLECT, float(val), apply);
6694 break;
6695 case ITEM_MOD_SPIRIT: //modify spirit
6697 ApplyStatBuffMod(STAT_SPIRIT, float(val), apply);
6698 break;
6699 case ITEM_MOD_STAMINA: //modify stamina
6701 ApplyStatBuffMod(STAT_STAMINA, float(val), apply);
6702 break;
6705 break;
6707 ApplyRatingMod(CR_DODGE, int32(val), apply);
6708 break;
6710 ApplyRatingMod(CR_PARRY, int32(val), apply);
6711 break;
6713 ApplyRatingMod(CR_BLOCK, int32(val), apply);
6714 break;
6716 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6717 break;
6719 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6720 break;
6722 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6723 break;
6725 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6726 break;
6728 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6729 break;
6731 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6732 break;
6735 break;
6738 break;
6741 break;
6744 break;
6747 break;
6750 break;
6752 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6753 break;
6755 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6756 break;
6758 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6759 break;
6761 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6762 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6763 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6764 break;
6766 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6767 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6768 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6769 break;
6774 break;
6780 break;
6782 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6783 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6784 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6785 break;
6787 ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
6788 break;
6792 break;
6795 break;
6796 // case ITEM_MOD_FERAL_ATTACK_POWER:
6797 // ApplyFeralAPBonus(int32(val), apply);
6798 // break;
6800 ApplyManaRegenBonus(int32(val), apply);
6801 break;
6804 break;
6806 ApplySpellPowerBonus(int32(val), apply);
6807 break;
6809 ApplyHealthRegenBonus(int32(val), apply);
6810 break;
6812 ApplySpellPenetrationBonus(val, apply);
6813 break;
6815 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(val), apply);
6816 break;
6820 break;
6821 }
6822 }
6823
6824 // Apply Spell Power from ScalingStatValue if set
6825 if (ssv)
6826 if (int32 spellbonus = ssv->getSpellBonus(ScalingStatValue))
6827 ApplySpellPowerBonus(spellbonus, apply);
6828
6829 // If set ScalingStatValue armor get it or use item armor
6830 uint32 armor = proto->Armor;
6831 if (ssv)
6832 {
6833 if (uint32 ssvarmor = ssv->getArmorMod(ScalingStatValue))
6834 if (proto->ScalingStatValue > 0 || ssvarmor < proto->Armor) //Check to avoid higher values than stat itself (heirloom OR items with correct armor value)
6835 armor = ssvarmor;
6836 }
6837 else if (armor && proto->ArmorDamageModifier)
6838 armor -= uint32(proto->ArmorDamageModifier);
6839
6840 if (armor)
6841 {
6842 UnitModifierType modType = TOTAL_VALUE;
6843 if (proto->Class == ITEM_CLASS_ARMOR)
6844 {
6845 switch (proto->SubClass)
6846 {
6852 modType = BASE_VALUE;
6853 break;
6854 }
6855 }
6856 HandleStatModifier(UNIT_MOD_ARMOR, modType, float(armor), apply);
6857 }
6858
6859 // Add armor bonus from ArmorDamageModifier if > 0
6860 if (proto->ArmorDamageModifier > 0 && sScriptMgr->OnPlayerCanArmorDamageModifier(this))
6861 HandleStatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(proto->ArmorDamageModifier), apply);
6862
6863 if (proto->Block)
6864 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(proto->Block), apply);
6865
6866 if (proto->HolyRes)
6867 HandleStatModifier(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, float(proto->HolyRes), apply);
6868
6869 if (proto->FireRes)
6870 HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(proto->FireRes), apply);
6871
6872 if (proto->NatureRes)
6873 HandleStatModifier(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, float(proto->NatureRes), apply);
6874
6875 if (proto->FrostRes)
6876 HandleStatModifier(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, float(proto->FrostRes), apply);
6877
6878 if (proto->ShadowRes)
6879 HandleStatModifier(UNIT_MOD_RESISTANCE_SHADOW, BASE_VALUE, float(proto->ShadowRes), apply);
6880
6881 if (proto->ArcaneRes)
6882 HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply);
6883
6884 uint8 attType = Player::GetAttackBySlot(slot);
6885 if (attType != MAX_ATTACK)
6886 {
6887 _ApplyWeaponDamage(slot, proto, ssv, apply);
6888 }
6889
6890 // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
6892 {
6893 int32 dpsMod = 0;
6894 int32 feral_bonus = 0;
6895 if (ssv)
6896 {
6897 dpsMod = ssv->getDPSMod(ScalingStatValue);
6898 feral_bonus += ssv->getFeralBonus(ScalingStatValue);
6899 }
6900
6901 feral_bonus += proto->getFeralBonus(dpsMod);
6902 sScriptMgr->OnPlayerGetFeralApBonus(this, feral_bonus, dpsMod, proto, ssv);
6903 if (feral_bonus)
6904 ApplyFeralAPBonus(feral_bonus, apply);
6905 }
6906}
DBCStorage< ScalingStatDistributionEntry > sScalingStatDistributionStore(ScalingStatDistributionfmt)
DBCStorage< ScalingStatValuesEntry > sScalingStatValuesStore(ScalingStatValuesfmt)
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:147
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:148
@ UNIT_MOD_ARMOR
Definition: Unit.h:157
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:162
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:161
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:164
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:158
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:163
@ UNIT_MOD_HEALTH
Definition: Unit.h:149
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:159
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:144
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:160
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:145
@ UNIT_MOD_MANA
Definition: Unit.h:150
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:146
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:165
@ SHIELD_BLOCK_VALUE
Definition: Unit.h:184
UnitModifierType
Definition: Unit.h:126
@ BASE_VALUE
Definition: Unit.h:127
@ TOTAL_VALUE
Definition: Unit.h:129
@ CR_EXPERTISE
Definition: Unit.h:241
@ CR_HIT_TAKEN_MELEE
Definition: Unit.h:229
@ CR_HASTE_RANGED
Definition: Unit.h:236
@ CR_HIT_MELEE
Definition: Unit.h:223
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:233
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:234
@ CR_ARMOR_PENETRATION
Definition: Unit.h:242
@ CR_CRIT_MELEE
Definition: Unit.h:226
@ CR_CRIT_RANGED
Definition: Unit.h:227
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:231
@ CR_PARRY
Definition: Unit.h:221
@ CR_DODGE
Definition: Unit.h:220
@ CR_DEFENSE_SKILL
Definition: Unit.h:219
@ CR_HASTE_MELEE
Definition: Unit.h:235
@ CR_BLOCK
Definition: Unit.h:222
@ CR_HASTE_SPELL
Definition: Unit.h:237
@ CR_HIT_SPELL
Definition: Unit.h:225
@ CR_HIT_TAKEN_RANGED
Definition: Unit.h:230
@ CR_CRIT_SPELL
Definition: Unit.h:228
@ CR_HIT_RANGED
Definition: Unit.h:224
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:232
@ CLASS_CONTEXT_STATS
Definition: UnitDefines.h:230
@ ITEM_MOD_CRIT_TAKEN_RANGED_RATING
Definition: ItemTemplate.h:48
@ ITEM_MOD_HIT_MELEE_RATING
Definition: ItemTemplate.h:38
@ ITEM_MOD_HIT_TAKEN_MELEE_RATING
Definition: ItemTemplate.h:44
@ ITEM_MOD_STAMINA
Definition: ItemTemplate.h:33
@ ITEM_MOD_HIT_SPELL_RATING
Definition: ItemTemplate.h:40
@ ITEM_MOD_SPELL_PENETRATION
Definition: ItemTemplate.h:69
@ ITEM_MOD_PARRY_RATING
Definition: ItemTemplate.h:36
@ ITEM_MOD_DEFENSE_SKILL_RATING
Definition: ItemTemplate.h:34
@ ITEM_MOD_HASTE_RANGED_RATING
Definition: ItemTemplate.h:51
@ ITEM_MOD_CRIT_TAKEN_RATING
Definition: ItemTemplate.h:56
@ ITEM_MOD_EXPERTISE_RATING
Definition: ItemTemplate.h:59
@ ITEM_MOD_MANA
Definition: ItemTemplate.h:27
@ ITEM_MOD_RANGED_ATTACK_POWER
Definition: ItemTemplate.h:61
@ ITEM_MOD_HEALTH
Definition: ItemTemplate.h:28
@ ITEM_MOD_CRIT_TAKEN_SPELL_RATING
Definition: ItemTemplate.h:49
@ ITEM_MOD_HIT_TAKEN_SPELL_RATING
Definition: ItemTemplate.h:46
@ ITEM_MOD_SPIRIT
Definition: ItemTemplate.h:32
@ ITEM_MOD_SPELL_POWER
Definition: ItemTemplate.h:67
@ ITEM_MOD_HASTE_SPELL_RATING
Definition: ItemTemplate.h:52
@ ITEM_MOD_ATTACK_POWER
Definition: ItemTemplate.h:60
@ ITEM_MOD_HASTE_RATING
Definition: ItemTemplate.h:58
@ ITEM_MOD_HIT_RANGED_RATING
Definition: ItemTemplate.h:39
@ ITEM_MOD_CRIT_SPELL_RATING
Definition: ItemTemplate.h:43
@ ITEM_MOD_BLOCK_VALUE
Definition: ItemTemplate.h:70
@ ITEM_MOD_CRIT_RANGED_RATING
Definition: ItemTemplate.h:42
@ ITEM_MOD_CRIT_MELEE_RATING
Definition: ItemTemplate.h:41
@ ITEM_MOD_STRENGTH
Definition: ItemTemplate.h:30
@ ITEM_MOD_HEALTH_REGEN
Definition: ItemTemplate.h:68
@ ITEM_MOD_BLOCK_RATING
Definition: ItemTemplate.h:37
@ ITEM_MOD_ARMOR_PENETRATION_RATING
Definition: ItemTemplate.h:66
@ ITEM_MOD_SPELL_HEALING_DONE
Definition: ItemTemplate.h:63
@ ITEM_MOD_CRIT_TAKEN_MELEE_RATING
Definition: ItemTemplate.h:47
@ ITEM_MOD_HIT_TAKEN_RATING
Definition: ItemTemplate.h:55
@ ITEM_MOD_HASTE_MELEE_RATING
Definition: ItemTemplate.h:50
@ ITEM_MOD_MANA_REGENERATION
Definition: ItemTemplate.h:65
@ ITEM_MOD_HIT_RATING
Definition: ItemTemplate.h:53
@ ITEM_MOD_INTELLECT
Definition: ItemTemplate.h:31
@ ITEM_MOD_RESILIENCE_RATING
Definition: ItemTemplate.h:57
@ ITEM_MOD_AGILITY
Definition: ItemTemplate.h:29
@ ITEM_MOD_DODGE_RATING
Definition: ItemTemplate.h:35
@ ITEM_MOD_CRIT_RATING
Definition: ItemTemplate.h:54
@ ITEM_MOD_SPELL_DAMAGE_DONE
Definition: ItemTemplate.h:64
@ ITEM_MOD_HIT_TAKEN_RANGED_RATING
Definition: ItemTemplate.h:45
@ ITEM_SUBCLASS_ARMOR_MAIL
Definition: ItemTemplate.h:393
@ ITEM_SUBCLASS_ARMOR_CLOTH
Definition: ItemTemplate.h:391
@ ITEM_SUBCLASS_ARMOR_LEATHER
Definition: ItemTemplate.h:392
@ ITEM_SUBCLASS_ARMOR_SHIELD
Definition: ItemTemplate.h:396
@ ITEM_SUBCLASS_ARMOR_PLATE
Definition: ItemTemplate.h:394
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:295
#define MAX_ITEM_PROTO_STATS
Definition: ItemTemplate.h:616
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ STAT_SPIRIT
Definition: SharedDefines.h:262
@ STAT_INTELLECT
Definition: SharedDefines.h:261
@ STAT_AGILITY
Definition: SharedDefines.h:259
@ STAT_STRENGTH
Definition: SharedDefines.h:258
@ STAT_STAMINA
Definition: SharedDefines.h:260
std::int32_t int32
Definition: Define.h:103
void ApplyRatingMod(CombatRating cr, int32 value, bool apply)
Definition: Player.cpp:5267
void ApplySpellPenetrationBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:219
void _ApplyWeaponDamage(uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
Definition: Player.cpp:6908
void ApplyManaRegenBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:915
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition: Player.cpp:1289
void ApplySpellPowerBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:167
void ApplyFeralAPBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:324
void ApplyHealthRegenBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:921
void HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
Definition: Player.cpp:5026
void ApplyStatBuffMod(Stats stat, float val, bool apply)
Definition: Unit.h:1020
bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
Definition: Unit.cpp:15254
uint8 GetLevel() const
Definition: Unit.h:1024
Definition: DBCStructure.h:1474
uint32 MaxLevel
Definition: DBCStructure.h:1478
uint32 Modifier[10]
Definition: DBCStructure.h:1477
int32 StatMod[10]
Definition: DBCStructure.h:1476
Definition: DBCStructure.h:1482
uint32 getArmorMod(uint32 mask) const
Definition: DBCStructure.h:1507
uint32 getDPSMod(uint32 mask) const
Definition: DBCStructure.h:1525
uint32 getFeralBonus(uint32 mask) const
Definition: DBCStructure.h:1555
uint32 getssdMultiplier(uint32 mask) const
Definition: DBCStructure.h:1493
uint32 getSpellBonus(uint32 mask) const
Definition: DBCStructure.h:1549

References _ApplyWeaponDamage(), ApplyFeralAPBonus(), ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), ItemTemplate::ArcaneRes, ItemTemplate::Armor, ItemTemplate::ArmorDamageModifier, BASE_VALUE, ItemTemplate::Block, ItemTemplate::Class, CLASS_CONTEXT_STATS, CLASS_DRUID, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, ItemTemplate::FireRes, FLAT_MOD, ItemTemplate::FrostRes, ScalingStatValuesEntry::getArmorMod(), GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), ItemTemplate::getFeralBonus(), ScalingStatValuesEntry::getFeralBonus(), Unit::GetLevel(), ScalingStatValuesEntry::getSpellBonus(), ScalingStatValuesEntry::getssdMultiplier(), HandleBaseModValue(), Unit::HandleStatModifier(), ItemTemplate::HolyRes, INVENTORY_SLOT_BAG_END, IsClass(), ITEM_CLASS_ARMOR, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_CRIT_TAKEN_MELEE_RATING, ITEM_MOD_CRIT_TAKEN_RANGED_RATING, ITEM_MOD_CRIT_TAKEN_RATING, ITEM_MOD_CRIT_TAKEN_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_MELEE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_HIT_TAKEN_MELEE_RATING, ITEM_MOD_HIT_TAKEN_RANGED_RATING, ITEM_MOD_HIT_TAKEN_RATING, ITEM_MOD_HIT_TAKEN_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, MAX_ATTACK, MAX_ITEM_PROTO_STATS, ScalingStatDistributionEntry::MaxLevel, ScalingStatDistributionEntry::Modifier, ItemTemplate::NatureRes, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, ItemTemplate::ShadowRes, SHIELD_BLOCK_VALUE, sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, ScalingStatDistributionEntry::StatMod, ItemTemplate::StatsCount, ItemTemplate::SubClass, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), and _RemoveAllItemMods().

◆ _ApplyItemMods()

void Player::_ApplyItemMods ( Item item,
uint8  slot,
bool  apply 
)
6579{
6580 if (slot >= INVENTORY_SLOT_BAG_END || !item)
6581 return;
6582
6583 ItemTemplate const* proto = item->GetTemplate();
6584
6585 if (!proto)
6586 return;
6587
6588 // not apply/remove mods for broken item
6589 if (item->IsBroken())
6590 return;
6591
6592 LOG_DEBUG("entities.player", "applying mods for item {} ", item->GetGUID().ToString());
6593
6594 uint8 attacktype = Player::GetAttackBySlot(slot);
6595
6596 if (item->HasSocket()) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items
6597 CorrectMetaGemEnchants(slot, apply);
6598
6599 if (attacktype < MAX_ATTACK)
6600 _ApplyWeaponDependentAuraMods(item, WeaponAttackType(attacktype), apply);
6601
6602 _ApplyItemBonuses(proto, slot, apply);
6603
6604 if (slot == EQUIPMENT_SLOT_RANGED)
6606
6607 ApplyItemEquipSpell(item, apply);
6608 ApplyEnchantment(item, apply);
6609
6610 LOG_DEBUG("entities.player.items", "_ApplyItemMods complete.");
6611}
bool HasSocket() const
Definition: Item.cpp:1007
bool IsBroken() const
Definition: Item.h:257
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:113
std::string ToString() const
Definition: ObjectGuid.cpp:47
void CorrectMetaGemEnchants(uint8 slot, bool apply)
Definition: Player.cpp:11157

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), CorrectMetaGemEnchants(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Object::GetGUID(), Item::GetTemplate(), Item::HasSocket(), INVENTORY_SLOT_BAG_END, Item::IsBroken(), LOG_DEBUG, MAX_ATTACK, and ObjectGuid::ToString().

Referenced by _ApplyAllLevelScaleItemMods(), DestroyItem(), DurabilityPointsLoss(), DurabilityRepair(), EquipItem(), and RemoveItem().

◆ _ApplyWeaponDamage()

void Player::_ApplyWeaponDamage ( uint8  slot,
ItemTemplate const *  proto,
ScalingStatValuesEntry const *  ssv,
bool  apply 
)
6909{
6910 uint32 CustomScalingStatValue = 0;
6911
6912 sScriptMgr->OnPlayerCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6913
6914 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6915
6916 // following part fix disarm issue
6917 // that doesn't apply the scaling after disarmed
6918 if (!ssv)
6919 {
6920 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6921
6922 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6923 uint32 ssd_level = GetLevel();
6924
6925 if (ssd && ssd_level > ssd->MaxLevel)
6926 ssd_level = ssd->MaxLevel;
6927
6928 ssv = ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6929 }
6930
6931 uint8 attType = Player::GetAttackBySlot(slot);
6932 if (!IsInFeralForm() && apply && !CanUseAttackType(attType))
6933 {
6934 return;
6935 }
6936
6937 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6938 {
6939 float minDamage = proto->Damage[i].DamageMin;
6940 float maxDamage = proto->Damage[i].DamageMax;
6941
6942 // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage
6943 if (ssv && i == 0) // scaling stats only for first damage
6944 {
6945 int32 extraDPS = ssv->getDPSMod(ScalingStatValue);
6946 if (extraDPS)
6947 {
6948 float average = extraDPS * proto->Delay / 1000.0f;
6949 float mod = ssv->IsTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;
6950
6951 minDamage = (1.0f - mod) * average;
6952 maxDamage = (1.0f + mod) * average;
6953 }
6954 }
6955
6956 if (apply)
6957 {
6958 sScriptMgr->OnPlayerApplyWeaponDamage(this, slot, proto, minDamage, maxDamage, i);
6959
6960 if (minDamage > 0.f)
6961 {
6962 SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, minDamage, i);
6963 }
6964
6965 if (maxDamage > 0.f)
6966 {
6967 SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, maxDamage, i);
6968 }
6969 }
6970 }
6971
6972 if (!apply)
6973 {
6974 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6975 {
6978 }
6979
6980 if (attType == BASE_ATTACK)
6981 {
6984 }
6985 }
6986
6987 if (proto->Delay && !IsInFeralForm())
6988 {
6989 if (slot == EQUIPMENT_SLOT_RANGED)
6990 SetAttackTime(RANGED_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6991 else if (slot == EQUIPMENT_SLOT_MAINHAND)
6992 SetAttackTime(BASE_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6993 else if (slot == EQUIPMENT_SLOT_OFFHAND)
6994 SetAttackTime(OFF_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6995 }
6996
6997 // No need to modify any physical damage for ferals as it is calculated from stats only
6998 if (IsInFeralForm())
6999 return;
7000
7001 if (CanModifyStats() && (GetWeaponDamageRange(WeaponAttackType(attType), MAXDAMAGE) || proto->Delay))
7003}
@ MINDAMAGE
Definition: Unit.h:136
@ MAXDAMAGE
Definition: Unit.h:137
#define BASE_ATTACK_TIME
Definition: Unit.h:42
@ OFF_ATTACK
Definition: Unit.h:211
@ BASE_ATTACK
Definition: Unit.h:210
#define BASE_MAXDAMAGE
Definition: Unit.h:41
#define BASE_MINDAMAGE
Definition: Unit.h:40
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:696
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:697
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:613
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
Definition: Unit.cpp:15503
void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
Definition: Unit.h:1137
bool IsInFeralForm() const
Definition: Unit.h:1864
void SetAttackTime(WeaponAttackType att, uint32 val)
Definition: Unit.h:863

References BASE_ATTACK, BASE_ATTACK_TIME, BASE_MAXDAMAGE, BASE_MINDAMAGE, Unit::CanModifyStats(), Unit::CanUseAttackType(), ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, ItemTemplate::Delay, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), Unit::GetLevel(), Unit::GetWeaponDamageRange(), Unit::IsInFeralForm(), ScalingStatValuesEntry::IsTwoHand(), MAX_ITEM_PROTO_DAMAGES, MAXDAMAGE, ScalingStatDistributionEntry::MaxLevel, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, Unit::SetAttackTime(), Unit::SetBaseWeaponDamage(), sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyItemBonuses(), AuraEffect::HandleAuraModDisarm(), and AuraEffect::HandleAuraModShapeshift().

◆ _ApplyWeaponDependentAuraCritMod()

void Player::_ApplyWeaponDependentAuraCritMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
7031{
7032 // don't apply mod if item is broken or cannot be used
7033 if (item->IsBroken() || !CanUseAttackType(attackType))
7034 return;
7035
7036 // generic not weapon specific case processes in aura code
7037 if (aura->GetSpellInfo()->EquippedItemClass == -1)
7038 return;
7039
7040 if (!sScriptMgr->OnPlayerCanApplyWeaponDependentAuraDamageMod(this, item, attackType, aura, apply))
7041 return;
7042
7044 switch (attackType)
7045 {
7046 case BASE_ATTACK:
7047 mod = CRIT_PERCENTAGE;
7048 break;
7049 case OFF_ATTACK:
7051 break;
7052 case RANGED_ATTACK:
7054 break;
7055 default:
7056 return;
7057 }
7058
7059 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
7060 HandleBaseModValue(mod, FLAT_MOD, float (aura->GetAmount()), apply);
7061}
BaseModGroup
Definition: Unit.h:180
@ OFFHAND_CRIT_PERCENTAGE
Definition: Unit.h:183
@ CRIT_PERCENTAGE
Definition: Unit.h:181
@ RANGED_CRIT_PERCENTAGE
Definition: Unit.h:182
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
Definition: Item.cpp:884

References BASE_ATTACK, BASEMOD_END, Unit::CanUseAttackType(), CRIT_PERCENTAGE, SpellInfo::EquippedItemClass, FLAT_MOD, AuraEffect::GetAmount(), AuraEffect::GetSpellInfo(), HandleBaseModValue(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, and sScriptMgr.

Referenced by _ApplyWeaponDependentAuraMods(), and AuraEffect::HandleAuraModWeaponCritPercent().

◆ _ApplyWeaponDependentAuraDamageMod()

void Player::_ApplyWeaponDependentAuraDamageMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
7064{
7065 // don't apply mod if item is broken or cannot be used
7066 if (item->IsBroken() || !CanUseAttackType(attackType))
7067 return;
7068
7069 // ignore spell mods for not wands
7070 if ((aura->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) == 0 && (getClassMask() & CLASSMASK_WAND_USERS) == 0)
7071 return;
7072
7073 // generic not weapon specific case processes in aura code
7074 if (aura->GetSpellInfo()->EquippedItemClass == -1)
7075 return;
7076
7077 UnitMods unitMod = UNIT_MOD_END;
7078 switch (attackType)
7079 {
7080 case BASE_ATTACK:
7081 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
7082 break;
7083 case OFF_ATTACK:
7084 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
7085 break;
7086 case RANGED_ATTACK:
7087 unitMod = UNIT_MOD_DAMAGE_RANGED;
7088 break;
7089 default:
7090 return;
7091 }
7092
7093 UnitModifierType unitModType = TOTAL_VALUE;
7094 switch (aura->GetAuraType())
7095 {
7097 unitModType = TOTAL_VALUE;
7098 break;
7100 unitModType = TOTAL_PCT;
7101 break;
7102 default:
7103 return;
7104 }
7105
7106 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
7107 {
7108 HandleStatModifier(unitMod, unitModType, float(aura->GetAmount()), apply);
7109 if (unitModType == TOTAL_VALUE)
7110 {
7111 if (aura->GetAmount() > 0)
7112 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply);
7113 else
7114 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, aura->GetAmount(), apply);
7115 }
7116 }
7117}
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
Definition: UpdateFields.h:360
@ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG
Definition: UpdateFields.h:361
UnitMods
Definition: Unit.h:143
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:167
@ UNIT_MOD_END
Definition: Unit.h:169
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:168
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:166
@ TOTAL_PCT
Definition: Unit.h:130
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
#define CLASSMASK_WAND_USERS
Definition: SharedDefines.h:174
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:297
void ApplyModUInt32Value(uint16 index, int32 val, bool apply)
Definition: Object.cpp:806
uint32 getClassMask() const
Definition: Unit.h:795

References Object::ApplyModUInt32Value(), BASE_ATTACK, Unit::CanUseAttackType(), CLASSMASK_WAND_USERS, SpellInfo::EquippedItemClass, AuraEffect::GetAmount(), AuraEffect::GetAuraType(), Unit::getClassMask(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), Unit::HandleStatModifier(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, RANGED_ATTACK, SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_SCHOOL_MASK_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, and UNIT_MOD_END.

Referenced by _ApplyWeaponDependentAuraMods(), AuraEffect::HandleModDamageDone(), and AuraEffect::HandleModDamagePercentDone().

◆ _ApplyWeaponDependentAuraMods()

void Player::_ApplyWeaponDependentAuraMods ( Item item,
WeaponAttackType  attackType,
bool  apply 
)
7016{
7018 for (AuraEffectList::const_iterator itr = auraCritList.begin(); itr != auraCritList.end(); ++itr)
7019 _ApplyWeaponDependentAuraCritMod(item, attackType, *itr, apply);
7020
7022 for (AuraEffectList::const_iterator itr = auraDamageFlatList.begin(); itr != auraDamageFlatList.end(); ++itr)
7023 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
7024
7026 for (AuraEffectList::const_iterator itr = auraDamagePctList.begin(); itr != auraDamagePctList.end(); ++itr)
7027 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
7028}
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
void _ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition: Player.cpp:7063
void _ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition: Player.cpp:7030
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1349
std::list< AuraEffect * > AuraEffectList
Definition: Unit.h:636

References _ApplyWeaponDependentAuraCritMod(), _ApplyWeaponDependentAuraDamageMod(), Unit::GetAuraEffectsByType(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and AuraEffect::HandleAuraModDisarm().

◆ _LoadActions()

void Player::_LoadActions ( PreparedQueryResult  result)
protected
5674{
5675 m_actionButtons.clear();
5676
5677 if (result)
5678 {
5679 do
5680 {
5681 Field* fields = result->Fetch();
5682 uint8 button = fields[0].Get<uint8>();
5683 uint32 action = fields[1].Get<uint32>();
5684 uint8 type = fields[2].Get<uint8>();
5685
5686 if (ActionButton* ab = addActionButton(button, action, type))
5687 ab->uState = ACTIONBUTTON_UNCHANGED;
5688 else
5689 {
5690
5691 LOG_ERROR("entities.player", "ActionButton loading problem, will be deleted from db. player: {}, guid: {}, button: {}, action: {}, type: {}", GetName(), GetGUID().GetCounter(), button, action, type);
5692
5693 // Will deleted in DB at next save (it can create data until save but marked as deleted)
5694 m_actionButtons[button].uState = ACTIONBUTTON_DELETED;
5695 }
5696 } while (result->NextRow());
5697 }
5698}
@ ACTIONBUTTON_UNCHANGED
Definition: Player.h:222
@ ACTIONBUTTON_DELETED
Definition: Player.h:225
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
Class used to access individual fields of database query result.
Definition: Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:112
std::string const & GetName() const
Definition: Object.h:464
LowType GetCounter() const
Definition: ObjectGuid.h:145
Definition: Player.h:259
ActionButton * addActionButton(uint8 button, uint32 action, uint8 type)
Definition: Player.cpp:5630
ActionButtonList m_actionButtons
Definition: Player.h:2832

References ACTIONBUTTON_DELETED, ACTIONBUTTON_UNCHANGED, addActionButton(), Field::Get(), ObjectGuid::GetCounter(), Object::GetGUID(), WorldObject::GetName(), LOG_ERROR, and m_actionButtons.

Referenced by WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and LoadFromDB().

◆ _LoadArenaTeamInfo()

void Player::_LoadArenaTeamInfo ( )
protected
4797{
4799
4800 for (auto const& itr : ArenaTeam::ArenaSlotByType)
4801 if (uint32 arenaTeamId = sCharacterCache->GetCharacterArenaTeamIdByGuid(GetGUID(), itr.second))
4802 {
4803 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
4804 if (!arenaTeam)
4805 {
4806 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No arena team was found.");
4807 continue;
4808 }
4809 ArenaTeamMember const* member = arenaTeam->GetMember(GetGUID());
4810 if (!member)
4811 {
4812 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No members in the arena team ({}) was found.", arenaTeamId);
4813 continue;
4814 }
4815 uint8 slot = itr.second;
4816
4817 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, arenaTeamId);
4818 SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, arenaTeam->GetType());
4819 SetArenaTeamInfoField(slot, ARENA_TEAM_MEMBER, (arenaTeam->GetCaptain() == GetGUID()) ? 0 : 1);
4824 }
4825}
#define sCharacterCache
Definition: CharacterCache.h:83
@ PLAYER_FIELD_ARENA_TEAM_INFO_1_1
Definition: UpdateFields.h:381
#define sArenaTeamMgr
Definition: ArenaTeamMgr.h:69
#define MAX_ARENA_SLOT
Definition: ArenaTeam.h:134
@ ARENA_TEAM_GAMES_WEEK
Definition: ArenaTeam.h:77
@ ARENA_TEAM_TYPE
Definition: ArenaTeam.h:75
@ ARENA_TEAM_ID
Definition: ArenaTeam.h:74
@ ARENA_TEAM_END
Definition: ArenaTeam.h:81
@ ARENA_TEAM_PERSONAL_RATING
Definition: ArenaTeam.h:80
@ ARENA_TEAM_MEMBER
Definition: ArenaTeam.h:76
@ ARENA_TEAM_WINS_SEASON
Definition: ArenaTeam.h:79
@ ARENA_TEAM_GAMES_SEASON
Definition: ArenaTeam.h:78
Definition: ArenaTeam.h:108
uint16 PersonalRating
Definition: ArenaTeam.h:116
uint16 SeasonWins
Definition: ArenaTeam.h:115
uint16 WeekGames
Definition: ArenaTeam.h:112
uint16 SeasonGames
Definition: ArenaTeam.h:114
Definition: ArenaTeam.h:137
ObjectGuid GetCaptain() const
Definition: ArenaTeam.h:153
ArenaTeamMember * GetMember(ObjectGuid guid)
Definition: ArenaTeam.cpp:1013
uint32 GetType() const
Definition: ArenaTeam.h:149
static std::unordered_map< uint32, uint8 > ArenaSlotByType
Definition: ArenaTeam.h:217
uint32 * m_uint32Values
Definition: Object.h:254
void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value)
Definition: Player.cpp:16137

References ARENA_TEAM_END, ARENA_TEAM_GAMES_SEASON, ARENA_TEAM_GAMES_WEEK, ARENA_TEAM_ID, ARENA_TEAM_MEMBER, ARENA_TEAM_PERSONAL_RATING, ARENA_TEAM_TYPE, ARENA_TEAM_WINS_SEASON, ArenaTeam::ArenaSlotByType, ArenaTeam::GetCaptain(), Object::GetGUID(), ArenaTeam::GetMember(), ArenaTeam::GetType(), LOG_ERROR, Object::m_uint32Values, MAX_ARENA_SLOT, ArenaTeamMember::PersonalRating, PLAYER_FIELD_ARENA_TEAM_INFO_1_1, sArenaTeamMgr, sCharacterCache, ArenaTeamMember::SeasonGames, ArenaTeamMember::SeasonWins, SetArenaTeamInfoField(), and ArenaTeamMember::WeekGames.

Referenced by LoadFromDB().

◆ _LoadAuras()

void Player::_LoadAuras ( PreparedQueryResult  result,
uint32  timediff 
)
protected
5701{
5702 LOG_DEBUG("entities.player.loading", "Loading auras for player {}", GetGUID().ToString());
5703
5704 /* 0 1 2 3 4 5 6 7 8 9 10 11
5705 QueryResult* result = CharacterDatabase.Query("SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2,
5706 12 13 14
5707 maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = '{}'", GetGUID().GetCounter());
5708 */
5709
5710 if (result)
5711 {
5712 do
5713 {
5714 Field* fields = result->Fetch();
5715 int32 damage[3];
5716 int32 baseDamage[3];
5717 ObjectGuid caster_guid = ObjectGuid(fields[0].Get<uint64>());
5718 ObjectGuid itemGuid = ObjectGuid(fields[1].Get<uint64>());
5719 uint32 spellid = fields[2].Get<uint32>();
5720 uint8 effmask = fields[3].Get<uint8>();
5721 uint8 recalculatemask = fields[4].Get<uint8>();
5722 uint8 stackcount = fields[5].Get<uint8>();
5723 damage[0] = fields[6].Get<int32>();
5724 damage[1] = fields[7].Get<int32>();
5725 damage[2] = fields[8].Get<int32>();
5726 baseDamage[0] = fields[9].Get<int32>();
5727 baseDamage[1] = fields[10].Get<int32>();
5728 baseDamage[2] = fields[11].Get<int32>();
5729 int32 maxduration = fields[12].Get<int32>();
5730 int32 remaintime = fields[13].Get<int32>();
5731 uint8 remaincharges = fields[14].Get<uint8>();
5732
5733 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
5734 if (!spellInfo)
5735 {
5736 LOG_ERROR("entities.player", "Unknown aura (spellid {}), ignore.", spellid);
5737 continue;
5738 }
5739
5740 // Xinef: leave this
5741 if (spellInfo->HasAura(SPELL_AURA_MOUNTED))
5742 {
5743 SetMountBlockId(spellInfo->Id);
5744 continue;
5745 }
5746
5747 // negative effects should continue counting down after logout
5748 if (remaintime != -1 && ((!spellInfo->IsPositive() && spellInfo->Id != 15007) || spellInfo->HasAttribute(SPELL_ATTR4_AURA_EXPIRES_OFFLINE))) // Xinef: resurrection sickness should not tick when logged off
5749 {
5750 if (remaintime / IN_MILLISECONDS <= int32(timediff))
5751 continue;
5752
5753 remaintime -= timediff * IN_MILLISECONDS;
5754 }
5755
5756 // prevent wrong values of remaincharges
5757 if (spellInfo->ProcCharges)
5758 {
5759 // we have no control over the order of applying auras and modifiers allow auras
5760 // to have more charges than value in SpellInfo
5761 if (remaincharges <= 0/* || remaincharges > spellproto->procCharges*/)
5762 remaincharges = spellInfo->ProcCharges;
5763 }
5764 else
5765 remaincharges = 0;
5766
5767 if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, nullptr, &baseDamage[0], nullptr, caster_guid, itemGuid))
5768 {
5769 if (!aura->CanBeSaved())
5770 {
5771 aura->Remove();
5772 continue;
5773 }
5774
5775 aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
5776 aura->ApplyForTargets();
5777 LOG_DEBUG("entities.player", "Added aura spellid {}, effectmask {}", spellInfo->Id, effmask);
5778 }
5779 } while (result->NextRow());
5780 }
5781}
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ SPELL_ATTR4_AURA_EXPIRES_OFFLINE
Definition: SharedDefines.h:532
Definition: ObjectGuid.h:118
void SetMountBlockId(uint32 mount)
Definition: Player.h:2615
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition: SpellAuras.cpp:352

References Field::Get(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, SetMountBlockId(), SPELL_ATTR4_AURA_EXPIRES_OFFLINE, SPELL_AURA_MOUNTED, sSpellMgr, Position::ToString(), and Aura::TryCreate().

Referenced by LoadFromDB().

◆ _LoadBrewOfTheMonth()

void Player::_LoadBrewOfTheMonth ( PreparedQueryResult  result)
protected
15724{
15725 uint32 lastEventId = 0;
15726 if (result)
15727 {
15728 Field* fields = result->Fetch();
15729 lastEventId = fields[0].Get<uint32>();
15730 }
15731
15732 uint16 month = static_cast<uint16>(Acore::Time::GetMonth());
15733 uint16 eventId = month;
15734 if (eventId < 9)
15735 eventId += 3;
15736 else
15737 eventId -= 9;
15738
15739 // Brew of the Month October (first in list)
15740 eventId += 34;
15741
15742 if (lastEventId != eventId && IsEventActive(eventId) && HasAchieved(2796 /* Brew of the Month*/))
15743 {
15744 // Send Mail
15745 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15746 MailSender sender(MAIL_CREATURE, 27487 /*NPC_BREW_OF_THE_MONTH_CLUB*/);
15747 MailDraft draft(uint16(212 + month)); // 212 is starting template id
15748 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
15749
15750 // Update Event Id
15752 stmt->SetData(0, GetGUID().GetCounter());
15753 stmt->SetData(1, uint32(eventId));
15754 trans->Append(stmt);
15755
15756 CharacterDatabase.CommitTransaction(trans);
15757 }
15758}
@ MAIL_CREATURE
Definition: Mail.h:39
bool IsEventActive(uint16 eventId)
Definition: GameEventMgr.cpp:1965
@ CHAR_REP_BREW_OF_THE_MONTH
Definition: CharacterDatabase.h:103
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:69
AC_COMMON_API uint32 GetMonth(Seconds time=0s)
Definition: Timer.cpp:424
Definition: PreparedStatement.h:157
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:77
bool HasAchieved(uint32 achievementId) const
Definition: Player.cpp:13861
Definition: Mail.h:83
Definition: Mail.h:105
Definition: Mail.h:119

References CHAR_REP_BREW_OF_THE_MONTH, CharacterDatabase, Field::Get(), Object::GetGUID(), Acore::Time::GetMonth(), HasAchieved(), IsEventActive(), MAIL_CREATURE, MailDraft::SendMailTo(), and PreparedStatementBase::SetData().

Referenced by LoadFromDB().

◆ _LoadCharacterSettings()

void Player::_LoadCharacterSettings ( PreparedQueryResult  result)
protected
27{
28 m_charSettingsMap.clear();
29
30 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
31 {
32 return;
33 }
34
35 if (result)
36 {
37 do
38 {
39 Field* fields = result->Fetch();
40
41 std::string source = fields[0].Get<std::string>();
42 std::string data = fields[1].Get<std::string>();
43
44 std::vector<std::string_view> tokens = Acore::Tokenize(data, ' ', false);
45
46 PlayerSettingVector setting;
47 setting.resize(tokens.size());
48
49 uint32 count = 0;
50
51 for (auto& token : tokens)
52 {
53 if (token.empty())
54 {
55 continue;
56 }
57
58 PlayerSetting set;
59 set.value = Acore::StringTo<uint32>(token).value();
60 setting[count] = set;
61 ++count;
62 }
63
64 m_charSettingsMap[source] = setting;
65
66 } while (result->NextRow());
67 }
68}
std::vector< PlayerSetting > PlayerSettingVector
Definition: PlayerSettings.h:48
@ CONFIG_PLAYER_SETTINGS_ENABLED
Definition: IWorld.h:168
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition: Tokenize.cpp:20
PlayerSettingMap m_charSettingsMap
Definition: Player.h:3020
Definition: PlayerSettings.h:39
uint32 value
Definition: PlayerSettings.h:40

References CONFIG_PLAYER_SETTINGS_ENABLED, Field::Get(), m_charSettingsMap, sWorld, Acore::Tokenize(), and PlayerSetting::value.

Referenced by LoadFromDB().

◆ _LoadDailyQuestStatus()

void Player::_LoadDailyQuestStatus ( PreparedQueryResult  result)
protected
6351{
6352 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
6353 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
6354
6355 m_DFQuests.clear();
6356
6357 //QueryResult* result = CharacterDatabase.Query("SELECT quest, time FROM character_queststatus_daily WHERE guid = '{}'", GetGUID().GetCounter());
6358
6359 if (result)
6360 {
6361 uint32 quest_daily_idx = 0;
6362
6363 do
6364 {
6365 Field* fields = result->Fetch();
6366 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(fields[0].Get<uint32>()))
6367 {
6368 if (qQuest->IsDFQuest())
6369 {
6370 m_DFQuests.insert(qQuest->GetQuestId());
6371 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6372 continue;
6373 }
6374 }
6375
6376 if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query
6377 {
6378 LOG_ERROR("entities.player", "Player ({}) have more 25 daily quest records in `charcter_queststatus_daily`", GetGUID().ToString());
6379 break;
6380 }
6381
6382 uint32 quest_id = fields[0].Get<uint32>();
6383
6384 // save _any_ from daily quest times (it must be after last reset anyway)
6385 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6386
6387 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6388 if (!quest)
6389 continue;
6390
6391 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
6392 ++quest_daily_idx;
6393
6394 LOG_DEBUG("entities.player.loading", "Daily quest ({}) cooldown for player ({})", quest_id, GetGUID().ToString());
6395 } while (result->NextRow());
6396 }
6397
6398 m_DailyQuestChanged = false;
6399}
@ PLAYER_FIELD_DAILY_QUESTS_1
Definition: UpdateFields.h:385
#define PLAYER_MAX_DAILY_QUESTS
Definition: Player.h:71
DFQuestsDoneList m_DFQuests
Definition: Player.h:2420
void SetUInt32Value(uint16 index, uint32 value)
Definition: Unit.cpp:21086
Definition: QuestDef.h:210

References Field::Get(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadDeclinedNames()

void Player::_LoadDeclinedNames ( PreparedQueryResult  result)
protected
4786{
4787 if (!result)
4788 return;
4789
4790 delete m_declinedname;
4792 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
4793 m_declinedname->name[i] = (*result)[i].Get<std::string>();
4794}
#define MAX_DECLINED_NAME_CASES
Definition: Unit.h:529
Definition: Unit.h:532
std::string name[MAX_DECLINED_NAME_CASES]
Definition: Unit.h:533

References m_declinedname, MAX_DECLINED_NAME_CASES, and DeclinedName::name.

Referenced by LoadFromDB().

◆ _LoadEntryPointData()

void Player::_LoadEntryPointData ( PreparedQueryResult  result)
protected
4859{
4860 if (!result)
4861 return;
4862
4863 Field* fields = result->Fetch();
4864 m_entryPointData.joinPos = WorldLocation(fields[4].Get<uint32>(), // Map
4865 fields[0].Get<float>(), // X
4866 fields[1].Get<float>(), // Y
4867 fields[2].Get<float>(), // Z
4868 fields[3].Get<float>()); // Orientation
4869
4870 m_entryPointData.taxiPath[0] = fields[5].Get<uint32>();
4871 m_entryPointData.taxiPath[1] = fields[6].Get<uint32>();
4872 m_entryPointData.mountSpell = fields[7].Get<uint32>();
4873}
Definition: Position.h:255
uint32 mountSpell
Definition: Player.h:1061
std::array< uint32, 2 > taxiPath
Definition: Player.h:1062
WorldLocation joinPos
Definition: Player.h:1063
EntryPointData m_entryPointData
Definition: Player.h:2697

References Field::Get(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, and EntryPointData::taxiPath.

Referenced by LoadFromDB().

◆ _LoadEquipmentSets()

void Player::_LoadEquipmentSets ( PreparedQueryResult  result)
protected
4828{
4829 // SetQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '{}' ORDER BY setindex", m_guid.GetCounter());
4830 if (!result)
4831 return;
4832
4833 uint32 count = 0;
4834 do
4835 {
4836 Field* fields = result->Fetch();
4837 EquipmentSet eqSet;
4838
4839 eqSet.Guid = fields[0].Get<uint64>();
4840 uint8 index = fields[1].Get<uint8>();
4841 eqSet.Name = fields[2].Get<std::string>();
4842 eqSet.IconName = fields[3].Get<std::string>();
4843 eqSet.IgnoreMask = fields[4].Get<uint32>();
4845
4846 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
4847 eqSet.Items[i] = ObjectGuid::Create<HighGuid::Item>(fields[5 + i].Get<uint32>());
4848
4849 m_EquipmentSets[index] = eqSet;
4850
4851 ++count;
4852
4853 if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit
4854 break;
4855 } while (result->NextRow());
4856}
@ EQUIPMENT_SET_UNCHANGED
Definition: Player.h:748
#define MAX_EQUIPMENT_SET_INDEX
Definition: Player.h:766
@ EQUIPMENT_SLOT_END
Definition: Player.h:700
std::uint64_t uint64
Definition: Define.h:106
Definition: Player.h:755
ObjectGuid Items[EQUIPMENT_SLOT_END]
Definition: Player.h:762
std::string Name
Definition: Player.h:759
std::string IconName
Definition: Player.h:760
EquipmentSetUpdateState state
Definition: Player.h:763
uint64 Guid
Definition: Player.h:758
uint32 IgnoreMask
Definition: Player.h:761
EquipmentSets m_EquipmentSets
Definition: Player.h:2928

References EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, Field::Get(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, MAX_EQUIPMENT_SET_INDEX, EquipmentSet::Name, and EquipmentSet::state.

Referenced by LoadFromDB().

◆ _LoadFriendList()

void Player::_LoadFriendList ( PreparedQueryResult  result)
protected

◆ _LoadGlyphAuras()

void Player::_LoadGlyphAuras ( )
protected
5784{
5785 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
5786 {
5787 if (uint32 glyph = GetGlyph(i))
5788 {
5789 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
5790 {
5791 if (GlyphSlotEntry const* glyphSlotEntry = sGlyphSlotStore.LookupEntry(GetGlyphSlot(i)))
5792 {
5793 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyphEntry->SpellId);
5794 if (glyphEntry->TypeFlags == glyphSlotEntry->TypeFlags)
5795 {
5796 if (!spellInfo->Stances)
5798 continue;
5799 }
5800 else
5801 LOG_ERROR("entities.player", "Player {} has glyph with typeflags {} in slot with typeflags {}, removing.", m_name, glyphEntry->TypeFlags, glyphSlotEntry->TypeFlags);
5802 }
5803 else
5804 LOG_ERROR("entities.player", "Player {} has not existing glyph slot entry {} on index {}", m_name, GetGlyphSlot(i), i);
5805 }
5806 else
5807 LOG_ERROR("entities.player", "Player {} has not existing glyph entry {} on index {}", m_name, glyph, i);
5808
5809 // On any error remove glyph
5810 SetGlyph(i, 0, true);
5811 }
5812 }
5813}
DBCStorage< GlyphSlotEntry > sGlyphSlotStore(GlyphSlotfmt)
DBCStorage< GlyphPropertiesEntry > sGlyphPropertiesStore(GlyphPropertiesfmt)
TriggerCastFlags
Definition: SpellDefines.h:132
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition: SpellDefines.h:150
@ TRIGGERED_IGNORE_CASTER_AURASTATE
Will ignore shapeshift checks.
Definition: SpellDefines.h:145
@ TRIGGERED_IGNORE_SHAPESHIFT
Will not adjust facing to target (if any)
Definition: SpellDefines.h:144
std::string m_name
Definition: Object.h:643
uint32 GetGlyph(uint8 slot) const
Definition: Player.h:1775
uint32 GetGlyphSlot(uint8 slot) const
Definition: Player.h:1766
void SetGlyph(uint8 slot, uint32 glyph, bool save)
Definition: Player.h:1767
Definition: DBCStructure.h:1022
Definition: DBCStructure.h:1030

References Unit::CastSpell(), GetGlyph(), GetGlyphSlot(), LOG_ERROR, WorldObject::m_name, MAX_GLYPH_SLOT_INDEX, SetGlyph(), sGlyphPropertiesStore, sGlyphSlotStore, sSpellMgr, SpellInfo::Stances, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, and TRIGGERED_IGNORE_SHAPESHIFT.

Referenced by LoadFromDB().

◆ _LoadGlyphs()

void Player::_LoadGlyphs ( PreparedQueryResult  result)
protected
14900{
14901 // SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 from character_glyphs WHERE guid = '%u'
14902 if (!result)
14903 return;
14904
14905 do
14906 {
14907 Field* fields = result->Fetch();
14908
14909 uint8 spec = fields[0].Get<uint8>();
14910 if (spec >= m_specsCount)
14911 continue;
14912
14913 m_Glyphs[spec][0] = fields[1].Get<uint16>();
14914 m_Glyphs[spec][1] = fields[2].Get<uint16>();
14915 m_Glyphs[spec][2] = fields[3].Get<uint16>();
14916 m_Glyphs[spec][3] = fields[4].Get<uint16>();
14917 m_Glyphs[spec][4] = fields[5].Get<uint16>();
14918 m_Glyphs[spec][5] = fields[6].Get<uint16>();
14919 } while (result->NextRow());
14920}

References Field::Get(), m_Glyphs, and m_specsCount.

Referenced by LoadFromDB().

◆ _LoadGroup()

void Player::_LoadGroup ( )
protected
6482{
6483 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(GetGUID()))
6484 {
6485 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
6486 {
6487 if (group->GetMemberGroup(GetGUID()) <= MAX_RAID_SUBGROUPS)
6488 {
6489 if (group->IsLeader(GetGUID()))
6490 {
6492 }
6493
6494 uint8 subgroup = group->GetMemberGroup(GetGUID());
6495 SetGroup(group, subgroup);
6496
6497 // the group leader may change the instance difficulty while the player is offline
6498 SetDungeonDifficulty(group->GetDungeonDifficulty());
6499 SetRaidDifficulty(group->GetRaidDifficulty());
6500 }
6501 }
6502 }
6503
6504 if (!GetGroup() || !GetGroup()->IsLeader(GetGUID()))
6506}
@ PLAYER_FLAGS_GROUP_LEADER
Definition: Player.h:480
#define sGroupMgr
Definition: GroupMgr.h:51
#define MAX_RAID_SUBGROUPS
Definition: Group.h:45
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1127
void RemovePlayerFlag(PlayerFlags flags)
Definition: Player.h:1128
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition: Player.h:1932
void SetGroup(Group *group, int8 subgroup=-1)
Definition: Player.cpp:11511
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition: Player.h:1933
Group * GetGroup()
Definition: Player.h:2478
Definition: Group.h:169

References GetGroup(), Object::GetGUID(), MAX_RAID_SUBGROUPS, PLAYER_FLAGS_GROUP_LEADER, RemovePlayerFlag(), sCharacterCache, SetDungeonDifficulty(), SetGroup(), SetPlayerFlag(), SetRaidDifficulty(), and sGroupMgr.

Referenced by LoadFromDB().

◆ _LoadHomeBind()

bool Player::_LoadHomeBind ( PreparedQueryResult  result)
protected
6989{
6990 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
6991 if (!info)
6992 {
6993 LOG_ERROR("entities.player", "Player (Name {}) has incorrect race/class pair. Can't be loaded.", GetName());
6994 return false;
6995 }
6996
6997 bool ok = false;
6998 // SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?
6999 if (result)
7000 {
7001 Field* fields = result->Fetch();
7002
7003 m_homebindMapId = fields[0].Get<uint16>();
7004 m_homebindAreaId = fields[1].Get<uint16>();
7005 m_homebindX = fields[2].Get<float>();
7006 m_homebindY = fields[3].Get<float>();
7007 m_homebindZ = fields[4].Get<float>();
7008
7009 MapEntry const* bindMapEntry = sMapStore.LookupEntry(m_homebindMapId);
7010
7011 // accept saved data only for valid position (and non instanceable), and accessable
7013 !bindMapEntry->Instanceable() && GetSession()->Expansion() >= bindMapEntry->Expansion())
7014 ok = true;
7015 else
7016 {
7018 stmt->SetData(0, GetGUID().GetCounter());
7019 CharacterDatabase.Execute(stmt);
7020 }
7021 }
7022
7023 if (!ok)
7024 {
7025 m_homebindMapId = info->mapId;
7026 m_homebindAreaId = info->areaId;
7027 m_homebindX = info->positionX;
7028 m_homebindY = info->positionY;
7029 m_homebindZ = info->positionZ;
7030
7032 stmt->SetData(0, GetGUID().GetCounter());
7033 stmt->SetData(1, m_homebindMapId);
7034 stmt->SetData(2, m_homebindAreaId);
7035 stmt->SetData (3, m_homebindX);
7036 stmt->SetData (4, m_homebindY);
7037 stmt->SetData (5, m_homebindZ);
7038 CharacterDatabase.Execute(stmt);
7039 }
7040
7041 LOG_DEBUG("entities.player", "Setting player home position - mapid: {}, areaid: {}, X: {}, Y: {}, Z: {}",
7043 return true;
7044}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
@ CHAR_INS_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:242
@ CHAR_DEL_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:244
Definition: Player.h:341
float positionX
Definition: Player.h:347
uint32 areaId
Definition: Player.h:346
float positionY
Definition: Player.h:348
float positionZ
Definition: Player.h:349
uint32 mapId
Definition: Player.h:345
uint8 getClass() const
Definition: Unit.h:793
uint8 getRace(bool original=false) const
Definition: Unit.cpp:20770
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition: MapMgr.h:90
uint8 Expansion() const
Definition: WorldSession.h:387
Definition: DBCStructure.h:1326

References PlayerInfo::areaId, CHAR_DEL_PLAYER_HOMEBIND, CHAR_INS_PLAYER_HOMEBIND, CharacterDatabase, WorldSession::Expansion(), Field::Get(), Unit::getClass(), ObjectGuid::GetCounter(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), GetSession(), MapMgr::IsValidMapCoord(), LOG_DEBUG, LOG_ERROR, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PreparedStatementBase::SetData(), sMapStore, and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadInstanceTimeRestrictions()

void Player::_LoadInstanceTimeRestrictions ( PreparedQueryResult  result)
protected
15712{
15713 if (!result)
15714 return;
15715
15716 do
15717 {
15718 Field* fields = result->Fetch();
15719 _instanceResetTimes.insert(InstanceTimeMap::value_type(fields[0].Get<uint32>(), fields[1].Get<uint64>()));
15720 } while (result->NextRow());
15721}
InstanceTimeMap _instanceResetTimes
Definition: Player.h:3000

References _instanceResetTimes.

Referenced by LoadFromDB().

◆ _LoadInventory()

void Player::_LoadInventory ( PreparedQueryResult  result,
uint32  timeDiff 
)
protected
5836{
5837 //QueryResult* result = CharacterDatabase.Query("SELECT data, text, bag, slot, item, item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '{}' ORDER BY bag, slot", GetGUID().GetCounter());
5838 //NOTE: the "order by `bag`" is important because it makes sure
5839 //the bagMap is filled before items in the bags are loaded
5840 //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?)
5841 //expected to be equipped before offhand items (TODO: fixme)
5842
5843 if (result)
5844 {
5845 uint32 zoneId = GetZoneId();
5846
5847 std::map<ObjectGuid::LowType, Bag*> bagMap; // fast guid lookup for bags
5848 std::map<ObjectGuid::LowType, Item*> invalidBagMap; // fast guid lookup for bags
5849 std::list<Item*> problematicItems;
5850 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
5851
5852 // Prevent items from being added to the queue while loading
5854 do
5855 {
5856 Field* fields = result->Fetch();
5857 if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields))
5858 {
5859 ObjectGuid::LowType bagGuid = fields[11].Get<uint32>();
5860 uint8 slot = fields[12].Get<uint8>();
5861
5862 uint8 err = EQUIP_ERR_OK;
5863 // Item is not in bag
5864 if (!bagGuid)
5865 {
5866 item->SetContainer(nullptr);
5867 item->SetSlot(slot);
5868
5870 {
5871 ItemPosCountVec dest;
5872 err = CanStoreItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false);
5873 if (err == EQUIP_ERR_OK)
5874 item = StoreItem(dest, item, true);
5875 }
5876 else if (IsEquipmentPos(INVENTORY_SLOT_BAG_0, slot))
5877 {
5878 uint16 dest;
5879 if (sScriptMgr->OnPlayerCheckItemInSlotAtLoadInventory(this, item, slot, err, dest))
5880 err = CanEquipItem(slot, dest, item, false, false);
5881 if (err == EQUIP_ERR_OK)
5882 QuickEquipItem(dest, item);
5883 }
5884 else if (IsBankPos(INVENTORY_SLOT_BAG_0, slot))
5885 {
5886 ItemPosCountVec dest;
5887 err = CanBankItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false, false);
5888 if (err == EQUIP_ERR_OK)
5889 item = BankItem(dest, item, true);
5890 }
5891
5892 // Remember bags that may contain items in them
5893 if (err == EQUIP_ERR_OK)
5894 {
5895 if (IsBagPos(item->GetPos()))
5896 if (Bag* pBag = item->ToBag())
5897 bagMap[item->GetGUID().GetCounter()] = pBag;
5898 }
5899 else if (IsBagPos(item->GetPos()))
5900 if (item->IsBag())
5901 invalidBagMap[item->GetGUID().GetCounter()] = item;
5902 }
5903 else
5904 {
5905 item->SetSlot(NULL_SLOT);
5906 // Item is in the bag, find the bag
5907 std::map<ObjectGuid::LowType, Bag*>::iterator itr = bagMap.find(bagGuid);
5908 if (itr != bagMap.end())
5909 {
5910 ItemPosCountVec dest;
5911 err = CanStoreItem(itr->second->GetSlot(), slot, dest, item);
5912 if (err == EQUIP_ERR_OK)
5913 item = StoreItem(dest, item, true);
5914 }
5915 else if (invalidBagMap.find(bagGuid) != invalidBagMap.end())
5916 {
5917 std::map<ObjectGuid::LowType, Item*>::iterator iterator = invalidBagMap.find(bagGuid);
5918 if (std::find(problematicItems.begin(), problematicItems.end(), iterator->second) != problematicItems.end())
5919 {
5921 }
5922 }
5923 else
5924 {
5925 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which doesnt have a valid bag (Bag GUID: {}, slot: {}). Possible cheat?",
5926 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot);
5927 item->DeleteFromInventoryDB(trans);
5928 delete item;
5929 continue;
5930 }
5931 }
5932
5933 // Item's state may have changed after storing
5934 if (err == EQUIP_ERR_OK)
5935 item->SetState(ITEM_UNCHANGED, this);
5936 else
5937 {
5938 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which can't be loaded into inventory (Bag GUID: {}, slot: {}) by reason {}. Item will be sent by mail.",
5939 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot, err);
5940 item->DeleteFromInventoryDB(trans);
5941 problematicItems.push_back(item);
5942 }
5943 }
5944 } while (result->NextRow());
5945
5947
5948 // Send problematic items by mail
5949 while (!problematicItems.empty())
5950 {
5951 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
5952
5953 MailDraft draft(subject, "There were problems with equipping item(s).");
5954 for (uint8 i = 0; !problematicItems.empty() && i < MAX_MAIL_ITEMS; ++i)
5955 {
5956 draft.AddItem(problematicItems.front());
5957 problematicItems.pop_front();
5958 }
5959 draft.SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
5960 }
5961 CharacterDatabase.CommitTransaction(trans);
5962 }
5963 //if (IsAlive())
5965}
#define MAX_MAIL_ITEMS
Definition: Mail.h:33
@ MAIL_CHECK_MASK_COPIED
This mail was returned. Do not allow returning mail back again.
Definition: Mail.h:49
@ MAIL_STATIONERY_GM
Definition: Mail.h:59
@ LANG_NOT_EQUIPPED_ITEM
Definition: Language.h:672
std::vector< ItemPosCount > ItemPosCountVec
Definition: Player.h:777
#define INVENTORY_SLOT_BAG_0
Definition: Player.h:676
@ EQUIP_ERR_OK
Definition: Item.h:47
@ EQUIP_ERR_INT_BAG_ERROR
Definition: Item.h:87
@ ITEM_UNCHANGED
Definition: Item.h:209
@ NULL_SLOT
Definition: Item.h:41
Definition: Bag.h:28
Bag * ToBag()
Definition: Item.h:250
uint32 GetZoneId() const
Definition: Object.cpp:3148
uint32 LowType
Definition: ObjectGuid.h:122
static bool IsEquipmentPos(uint16 pos)
Definition: Player.h:1276
InventoryResult CanEquipItem(uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition: PlayerStorage.cpp:1805
void QuickEquipItem(uint16 pos, Item *pItem)
Definition: PlayerStorage.cpp:2835
Item * BankItem(ItemPosCountVec const &dest, Item *pItem, bool update)
Definition: Player.h:1345
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
Definition: Player.h:1296
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
Definition: PlayerStorage.cpp:2574
static bool IsInventoryPos(uint16 pos)
Definition: Player.h:1274
Item * _LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
Definition: PlayerStorage.cpp:5967
static bool IsBagPos(uint16 pos)
Definition: PlayerStorage.cpp:590
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition: PlayerStorage.cpp:2032
static bool IsBankPos(uint16 pos)
Definition: Player.h:1279
std::string GetAcoreString(uint32 entry) const
Definition: WorldSession.cpp:807

References _ApplyAllItemMods(), _LoadItem(), MailDraft::AddItem(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CharacterDatabase, EQUIP_ERR_INT_BAG_ERROR, EQUIP_ERR_OK, Field::Get(), WorldSession::GetAcoreString(), Object::GetGUID(), WorldObject::GetName(), GetSession(), WorldObject::GetZoneId(), INVENTORY_SLOT_BAG_0, IsBagPos(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), ITEM_UNCHANGED, LANG_NOT_EQUIPPED_ITEM, LOG_ERROR, m_itemUpdateQueueBlocked, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MAX_MAIL_ITEMS, NULL_SLOT, QuickEquipItem(), MailDraft::SendMailTo(), sScriptMgr, StoreItem(), Item::ToBag(), and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadItem()

Item * Player::_LoadItem ( CharacterDatabaseTransaction  trans,
uint32  zoneId,
uint32  timeDiff,
Field fields 
)
private
5968{
5969 Item* item = nullptr;
5970 ObjectGuid::LowType itemGuid = fields[13].Get<uint32>();
5971 uint32 itemEntry = fields[14].Get<uint32>();
5972 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry))
5973 {
5974 bool remove = false;
5975 item = NewItemOrBag(proto);
5976 if (item->LoadFromDB(itemGuid, GetGUID(), fields, itemEntry))
5977 {
5978 CharacterDatabasePreparedStatement* stmt = nullptr;
5979
5980 // Do not allow to have item limited to another map/zone in alive state
5981 if (IsAlive() && item->IsLimitedToAnotherMapOrZone(GetMapId(), zoneId))
5982 {
5983 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', map: {}) has item ({}, entry: {}) limited to another map ({}). Deleting item.",
5984 GetGUID().ToString(), GetName(), GetMapId(), item->GetGUID().ToString(), item->GetEntry(), zoneId);
5985 remove = true;
5986 }
5987 // "Conjured items disappear if you are logged out for more than 15 minutes"
5988 else if (timeDiff > 15 * MINUTE && proto->HasFlag(ITEM_FLAG_CONJURED))
5989 {
5990 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', diff: {}) has conjured item ({}, entry: {}) with expired lifetime (15 minutes). Deleting item.",
5991 GetGUID().ToString(), GetName(), timeDiff, item->GetGUID().ToString(), item->GetEntry());
5992 remove = true;
5993 }
5994 else if (item->IsRefundable())
5995 {
5996 if (item->GetPlayedTime() > (2 * HOUR))
5997 {
5998 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with expired refund time ({}). Deleting refund data and removing refundable flag.",
5999 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), item->GetPlayedTime());
6000 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE);
6001 stmt->SetData(0, item->GetGUID().GetCounter());
6002 trans->Append(stmt);
6003
6005 }
6006 else
6007 {
6008 // xinef: sync query
6009 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_REFUNDS);
6010 stmt->SetData(0, item->GetGUID().GetCounter());
6011 stmt->SetData(1, GetGUID().GetCounter());
6012 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6013 {
6014 item->SetRefundRecipient((*result)[0].Get<uint32>());
6015 item->SetPaidMoney((*result)[1].Get<uint32>());
6016 item->SetPaidExtendedCost((*result)[2].Get<uint16>());
6017 AddRefundReference(item->GetGUID());
6018 }
6019 else
6020 {
6021 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with refundable flags, but without data in item_refund_instance. Removing flag.",
6022 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6024 }
6025 }
6026 }
6027 else if (item->IsBOPTradable())
6028 {
6029 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE);
6030 stmt->SetData(0, item->GetGUID().GetCounter());
6031
6032 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6033 {
6034 AllowedLooterSet looters;
6035 for (std::string_view guidStr : Acore::Tokenize((*result)[0].Get<std::string_view>(), ' ', false))
6036 {
6037 if (Optional<ObjectGuid::LowType> guid = Acore::StringTo<ObjectGuid::LowType>(guidStr))
6038 {
6039 looters.insert(ObjectGuid::Create<HighGuid::Player>(*guid));
6040 }
6041 else
6042 {
6043 LOG_WARN("entities.player.loading", "Player::_LoadInventory: invalid item_soulbound_trade_data GUID '{}' for item {}. Skipped.", guidStr, item->GetGUID().ToString());
6044 }
6045 }
6046
6047 if (looters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
6048 {
6049 item->SetSoulboundTradeable(looters);
6050 AddTradeableItem(item);
6051 }
6052 else
6053 item->ClearSoulboundTradeable(this);
6054 }
6055 else
6056 {
6057 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with ITEM_FIELD_FLAG_BOP_TRADEABLE flag, but without data in item_soulbound_trade_data. Removing flag.",
6058 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6060 }
6061 }
6062 else if (proto->HolidayId)
6063 {
6064 remove = true;
6065 GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
6066 GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
6067 for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
6068 {
6069 if (uint32(events[*itr].HolidayId) == proto->HolidayId)
6070 {
6071 remove = false;
6072 break;
6073 }
6074 }
6075 }
6076 }
6077 else
6078 {
6079 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has broken item (GUID: {}, entry: {}) in inventory. Deleting item.",
6080 GetGUID().ToString(), GetName(), itemGuid, itemEntry);
6081 remove = true;
6082 }
6083 // Remove item from inventory if necessary
6084 if (remove)
6085 {
6086 Item::DeleteFromInventoryDB(trans, itemGuid);
6087 item->FSetState(ITEM_REMOVED);
6088 item->SaveToDB(trans); // it also deletes item object!
6089 item = nullptr;
6090 }
6091 }
6092 else
6093 {
6094 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has unknown item (entry: {}) in inventory. Deleting item.",
6095 GetGUID().ToString(), GetName(), itemEntry);
6096 Item::DeleteFromInventoryDB(trans, itemGuid);
6097 Item::DeleteFromDB(trans, itemGuid);
6098 }
6099 return item;
6100}
@ ITEM_FIELD_FLAGS
Definition: UpdateFields.h:42
Item * NewItemOrBag(ItemTemplate const *proto)
Definition: Bag.h:67
@ ITEM_REMOVED
Definition: Item.h:212
@ ITEM_FIELD_FLAG_REFUNDABLE
Definition: ItemTemplate.h:121
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
Definition: ItemTemplate.h:117
@ ITEM_FLAG_CONJURED
Definition: ItemTemplate.h:148
#define sGameEventMgr
Definition: GameEventMgr.h:201
GuidSet AllowedLooterSet
Definition: LootMgr.h:151
@ CHAR_DEL_ITEM_REFUND_INSTANCE
Definition: CharacterDatabase.h:376
@ CHAR_SEL_ITEM_BOP_TRADE
Definition: CharacterDatabase.h:120
@ CHAR_SEL_ITEM_REFUNDS
Definition: CharacterDatabase.h:119
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition: DatabaseEnvFwd.h:45
events
Definition: boss_sartura.cpp:43
#define LOG_WARN(filterType__,...)
Definition: Log.h:161
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:24
constexpr auto HOUR
Definition: Common.h:48
constexpr auto MINUTE
Definition: Common.h:47
uint32 GetPlayedTime()
Definition: Item.cpp:1246
static void DeleteFromInventoryDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:532
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
Definition: Item.cpp:419
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition: Item.cpp:336
bool IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const
Definition: Item.cpp:1056
void SetSoulboundTradeable(AllowedLooterSet &allowedLooters)
Definition: Item.cpp:1258
void SetPaidMoney(uint32 money)
Definition: Item.h:345
bool IsSoulBound() const
Definition: Item.h:236
bool IsBOPTradable() const
Definition: Item.h:262
void SetRefundRecipient(ObjectGuid::LowType pGuidLow)
Definition: Item.h:344
bool IsRefundable() const
Definition: Item.h:261
void FSetState(ItemUpdateState state)
Definition: Item.h:330
void SetPaidExtendedCost(uint32 iece)
Definition: Item.h:346
void ClearSoulboundTradeable(Player *currentOwner)
Definition: Item.cpp:1264
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:518
uint32 GetMaxStackSize() const
Definition: ItemTemplate.h:729
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:860
uint32 GetEntry() const
Definition: Object.h:116
uint32 GetMapId() const
Definition: Position.h:280
void AddRefundReference(ObjectGuid itemGUID)
Definition: Player.cpp:15449
void AddTradeableItem(Item *item)
Definition: PlayerStorage.cpp:4132
bool IsAlive() const
Definition: Unit.h:1698
std::vector< GameEventData > GameEventDataMap
Definition: GameEventMgr.h:107
std::set< uint16 > ActiveEvents
Definition: GameEventMgr.h:106

References AddRefundReference(), AddTradeableItem(), CHAR_DEL_ITEM_REFUND_INSTANCE, CHAR_SEL_ITEM_BOP_TRADE, CHAR_SEL_ITEM_REFUNDS, CharacterDatabase, Item::ClearSoulboundTradeable(), Item::DeleteFromDB(), Item::DeleteFromInventoryDB(), Item::FSetState(), Field::Get(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), ItemTemplate::GetMaxStackSize(), WorldObject::GetName(), Item::GetPlayedTime(), Item::GetTemplate(), HOUR, Unit::IsAlive(), Item::IsBOPTradable(), Item::IsLimitedToAnotherMapOrZone(), Item::IsRefundable(), Item::IsSoulBound(), ITEM_FIELD_FLAG_BOP_TRADEABLE, ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_CONJURED, ITEM_REMOVED, Item::LoadFromDB(), LOG_DEBUG, LOG_ERROR, LOG_WARN, MINUTE, NewItemOrBag(), Object::RemoveFlag(), Item::SaveToDB(), PreparedStatementBase::SetData(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), Item::SetSoulboundTradeable(), sGameEventMgr, sObjectMgr, Acore::Tokenize(), ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory().

◆ _LoadMail()

void Player::_LoadMail ( PreparedQueryResult  mailsResult,
PreparedQueryResult  mailItemsResult 
)
protected
6156{
6157 time_t cur_time = GameTime::GetGameTime().count();
6158
6159 m_mail.clear();
6160
6161 std::unordered_map<uint32, Mail*> mailById;
6162
6163 if (mailsResult)
6164 {
6165 do
6166 {
6167 Field* fields = mailsResult->Fetch();
6168 Mail* m = new Mail;
6169
6170 m->messageID = fields[0].Get<uint32>();
6171 m->messageType = fields[1].Get<uint8>();
6172 m->sender = fields[2].Get<uint32>();
6173 m->receiver = fields[3].Get<uint32>();
6174 m->subject = fields[4].Get<std::string>();
6175 m->body = fields[5].Get<std::string>();
6176 m->expire_time = time_t(fields[6].Get<uint32>());
6177 m->deliver_time = time_t(fields[7].Get<uint32>());
6178 m->money = fields[8].Get<uint32>();
6179 m->COD = fields[9].Get<uint32>();
6180 m->checked = fields[10].Get<uint8>();
6181 m->stationery = fields[11].Get<uint8>();
6182 m->mailTemplateId = fields[12].Get<int16>();
6183
6184 if (cur_time > m->expire_time)
6185 {
6186 LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - ignored.", m->messageID);
6187 continue;
6188 }
6189
6190 if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId))
6191 {
6192 LOG_ERROR("entities.player", "Player::_LoadMail: Mail ({}) has nonexistent MailTemplateId ({}), remove at load", m->messageID, m->mailTemplateId);
6193 m->mailTemplateId = 0;
6194 }
6195
6197
6198 m_mail.push_back(m);
6199 mailById[m->messageID] = m;
6200 } while (mailsResult->NextRow());
6201 }
6202
6203 if (mailItemsResult)
6204 {
6205 do
6206 {
6207 Field* fields = mailItemsResult->Fetch();
6208 uint32 mailId = fields[14].Get<uint32>();
6209 _LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields);
6210 } while (mailItemsResult->NextRow());
6211 }
6212
6214}
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
@ MAIL_STATE_UNCHANGED
Definition: Mail.h:68
std::int16_t int16
Definition: Define.h:104
void UpdateNextMailTimeAndUnreads()
Definition: PlayerUpdates.cpp:436
static Item * _LoadMailedItem(ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
Definition: PlayerStorage.cpp:6103
Definition: Mail.h:167
ObjectGuid::LowType receiver
Definition: Mail.h:173
uint8 messageType
Definition: Mail.h:169
uint32 messageID
Definition: Mail.h:168
time_t expire_time
Definition: Mail.h:178
uint32 sender
Definition: Mail.h:172
uint8 stationery
Definition: Mail.h:170
std::string subject
Definition: Mail.h:174
std::string body
Definition: Mail.h:175
time_t deliver_time
Definition: Mail.h:179
uint32 COD
Definition: Mail.h:181
uint32 checked
Definition: Mail.h:182
MailState state
Definition: Mail.h:183
uint32 money
Definition: Mail.h:180
uint16 mailTemplateId
Definition: Mail.h:171

References _LoadMailedItem(), Mail::body, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_mail, MAIL_STATE_UNCHANGED, Mail::mailTemplateId, Mail::messageID, Mail::messageType, Mail::money, Mail::receiver, Mail::sender, sMailTemplateStore, Mail::state, Mail::stationery, Mail::subject, and UpdateNextMailTimeAndUnreads().

Referenced by LoadFromDB().

◆ _LoadMailedItem()

Item * Player::_LoadMailedItem ( ObjectGuid const &  playerGuid,
Player player,
uint32  mailId,
Mail mail,
Field fields 
)
staticprotected
6104{
6105 ObjectGuid::LowType itemGuid = fields[11].Get<uint32>();
6106 uint32 itemEntry = fields[12].Get<uint32>();
6107
6108 ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry);
6109 if (!proto)
6110 {
6111 LOG_ERROR("entities.player", "Player {} ({}) has unknown item in mailed items (GUID: {}, Entry: {}) in mail ({}), deleted.",
6112 player ? player->GetName() : "<unknown>", playerGuid.ToString(), itemGuid, itemEntry, mailId);
6113
6114 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
6115
6117 stmt->SetData(0, itemGuid);
6118 trans->Append(stmt);
6119
6120 CharacterDatabase.CommitTransaction(trans);
6121 return nullptr;
6122 }
6123
6124 Item* item = NewItemOrBag(proto);
6125
6126 ObjectGuid ownerGuid = fields[13].Get<uint32>() ? ObjectGuid::Create<HighGuid::Player>(fields[13].Get<uint32>()) : ObjectGuid::Empty;
6127 if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
6128 {
6129 LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: {}) in mail ({}) doesn't exist, deleted from mail.", itemGuid, mailId);
6130
6132 stmt->SetData(0, itemGuid);
6133 CharacterDatabase.Execute(stmt);
6134
6135 item->FSetState(ITEM_REMOVED);
6136
6138 item->SaveToDB(temp);
6139 return nullptr;
6140 }
6141
6142 if (mail)
6143 {
6144 mail->AddItem(itemGuid, itemEntry);
6145 }
6146
6147 if (player)
6148 {
6149 player->AddMItem(item);
6150 }
6151
6152 return item;
6153}
@ CHAR_DEL_INVALID_MAIL_ITEM
Definition: CharacterDatabase.h:113
@ CHAR_DEL_MAIL_ITEM
Definition: CharacterDatabase.h:112
static ObjectGuid const Empty
Definition: ObjectGuid.h:120
void AddMItem(Item *it)
Definition: Player.h:1682
void AddItem(ObjectGuid::LowType itemGuidLow, uint32 item_template)
Definition: Mail.h:185

References Mail::AddItem(), AddMItem(), CHAR_DEL_INVALID_MAIL_ITEM, CHAR_DEL_MAIL_ITEM, CharacterDatabase, ObjectGuid::Empty, Item::FSetState(), Field::Get(), WorldObject::GetName(), ITEM_REMOVED, Item::LoadFromDB(), LOG_ERROR, NewItemOrBag(), Item::SaveToDB(), PreparedStatementBase::SetData(), sObjectMgr, and ObjectGuid::ToString().

Referenced by _LoadMail(), and DeleteFromDB().

◆ _LoadMonthlyQuestStatus()

void Player::_LoadMonthlyQuestStatus ( PreparedQueryResult  result)
protected
6447{
6448 m_monthlyquests.clear();
6449
6450 if (result)
6451 {
6452 do
6453 {
6454 Field* fields = result->Fetch();
6455 uint32 quest_id = fields[0].Get<uint32>();
6456 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6457 if (!quest)
6458 continue;
6459
6460 m_monthlyquests.insert(quest_id);
6461 LOG_DEBUG("entities.player.loading", "Monthly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6462 } while (result->NextRow());
6463 }
6464
6465 m_MonthlyQuestChanged = false;
6466}
QuestSet m_monthlyquests
Definition: Player.h:2709

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_MonthlyQuestChanged, m_monthlyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadPetStable()

void Player::_LoadPetStable ( uint8  petStableSlots,
PreparedQueryResult  result 
)
protected
15761{
15762 if (!petStableSlots && !result)
15763 return;
15764
15765 m_petStable = std::make_unique<PetStable>();
15766 m_petStable->MaxStabledPets = petStableSlots;
15767
15768 if (m_petStable->MaxStabledPets > MAX_PET_STABLES)
15769 {
15770 LOG_ERROR("entities.player", "Player::LoadFromDB: Player ({}) can't have more stable slots than {}, but has {} in DB",
15771 GetGUID().ToString(), MAX_PET_STABLES, m_petStable->MaxStabledPets);
15772
15773 m_petStable->MaxStabledPets = MAX_PET_STABLES;
15774 }
15775
15776 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15777 // SELECT id, entry, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ?
15778 if (result)
15779 {
15780 do
15781 {
15782 Field* fields = result->Fetch();
15783 PetStable::PetInfo petInfo;
15784 petInfo.PetNumber = fields[0].Get<uint32>();
15785 petInfo.CreatureId = fields[1].Get<uint32>();
15786 petInfo.DisplayId = fields[2].Get<uint32>();
15787 petInfo.Level = fields[3].Get<uint16>();
15788 petInfo.Experience = fields[4].Get<uint32>();
15789 petInfo.ReactState = ReactStates(fields[5].Get<uint8>());
15790 PetSaveMode slot = PetSaveMode(fields[6].Get<uint8>());
15791 petInfo.Name = fields[7].Get<std::string>();
15792 petInfo.WasRenamed = fields[8].Get<bool>();
15793 petInfo.Health = fields[9].Get<uint32>();
15794 petInfo.Mana = fields[10].Get<uint32>();
15795 petInfo.Happiness = fields[11].Get<uint32>();
15796 petInfo.ActionBar = fields[12].Get<std::string>();
15797 petInfo.LastSaveTime = fields[13].Get<uint32>();
15798 petInfo.CreatedBySpellId = fields[14].Get<uint32>();
15799 petInfo.Type = PetType(fields[15].Get<uint8>());
15800
15801 if (slot == PET_SAVE_AS_CURRENT)
15802 m_petStable->CurrentPet = std::move(petInfo);
15803 else if (slot >= PET_SAVE_FIRST_STABLE_SLOT && slot <= PET_SAVE_LAST_STABLE_SLOT)
15804 m_petStable->StabledPets[slot - 1] = std::move(petInfo);
15805 else if (slot == PET_SAVE_NOT_IN_SLOT)
15806 m_petStable->UnslottedPets.push_back(std::move(petInfo));
15807
15808 } while (result->NextRow());
15809 }
15810}
PetSaveMode
Definition: PetDefines.h:40
@ PET_SAVE_FIRST_STABLE_SLOT
Definition: PetDefines.h:43
@ PET_SAVE_LAST_STABLE_SLOT
Definition: PetDefines.h:44
@ PET_SAVE_NOT_IN_SLOT
Definition: PetDefines.h:45
@ PET_SAVE_AS_CURRENT
Definition: PetDefines.h:42
PetType
Definition: PetDefines.h:30
constexpr auto MAX_PET_STABLES
Definition: PetDefines.h:36
ReactStates
Definition: Unit.h:548
Definition: PetDefines.h:209
uint32 Mana
Definition: PetDefines.h:219
uint32 Happiness
Definition: PetDefines.h:220
uint32 CreatedBySpellId
Definition: PetDefines.h:222
uint32 Health
Definition: PetDefines.h:218
uint32 CreatureId
Definition: PetDefines.h:215
bool WasRenamed
Definition: PetDefines.h:226
uint8 Level
Definition: PetDefines.h:223
uint32 DisplayId
Definition: PetDefines.h:216
ReactStates ReactState
Definition: PetDefines.h:224
std::string Name
Definition: PetDefines.h:212
PetType Type
Definition: PetDefines.h:225
uint32 Experience
Definition: PetDefines.h:217
uint32 PetNumber
Definition: PetDefines.h:214
uint32 LastSaveTime
Definition: PetDefines.h:221
std::string ActionBar
Definition: PetDefines.h:213
std::unique_ptr< PetStable > m_petStable
Definition: Player.h:2987

References PetStable::PetInfo::ActionBar, PetStable::PetInfo::CreatedBySpellId, PetStable::PetInfo::CreatureId, PetStable::PetInfo::DisplayId, PetStable::PetInfo::Experience, Field::Get(), Object::GetGUID(), PetStable::PetInfo::Happiness, PetStable::PetInfo::Health, PetStable::PetInfo::LastSaveTime, PetStable::PetInfo::Level, LOG_ERROR, m_petStable, PetStable::PetInfo::Mana, MAX_PET_STABLES, PetStable::PetInfo::Name, PET_SAVE_AS_CURRENT, PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT, PET_SAVE_NOT_IN_SLOT, PetStable::PetInfo::PetNumber, PetStable::PetInfo::ReactState, Position::ToString(), PetStable::PetInfo::Type, and PetStable::PetInfo::WasRenamed.

Referenced by LoadFromDB().

◆ _LoadQuestStatus()

void Player::_LoadQuestStatus ( PreparedQueryResult  result)
protected
6229{
6230 uint16 slot = 0;
6231
6233 //QueryResult* result = CharacterDatabase.Query("SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3,
6234 // 11 12 13 14
6235 // itemcount4, itemcount5, itemcount6, playercount FROM character_queststatus WHERE guid = '{}'", GetGUID().GetCounter());
6236
6237 if (result)
6238 {
6239 do
6240 {
6241 Field* fields = result->Fetch();
6242
6243 uint32 quest_id = fields[0].Get<uint32>();
6244 // used to be new, no delete?
6245 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6246 if (quest)
6247 {
6248 // find or create
6249 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
6250
6251 uint8 qstatus = fields[1].Get<uint8>();
6252 if (qstatus < MAX_QUEST_STATUS)
6253 questStatusData.Status = QuestStatus(qstatus);
6254 else
6255 {
6256 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
6257 LOG_ERROR("entities.player", "Player {} ({}) has invalid quest {} status ({}), replaced by QUEST_STATUS_INCOMPLETE(3).",
6258 GetName(), GetGUID().ToString(), quest_id, qstatus);
6259 }
6260
6261 questStatusData.Explored = (fields[2].Get<uint8>() > 0);
6262
6263 time_t quest_time = time_t(fields[3].Get<uint32>());
6264
6265 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && !GetQuestRewardStatus(quest_id))
6266 {
6267 AddTimedQuest(quest_id);
6268
6269 if (quest_time <= GameTime::GetGameTime().count())
6270 questStatusData.Timer = 1;
6271 else
6272 questStatusData.Timer = uint32((quest_time - GameTime::GetGameTime().count()) * IN_MILLISECONDS);
6273 }
6274 else
6275 quest_time = 0;
6276
6277 for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
6278 questStatusData.CreatureOrGOCount[i] = fields[4 + i].Get<uint16>();
6279
6280 for (uint32 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
6281 questStatusData.ItemCount[i] = fields[8 + i].Get<uint16>();
6282
6283 questStatusData.PlayerCount = fields[14].Get<uint16>();
6284
6285 // add to quest log
6286 if (slot < MAX_QUEST_LOG_SIZE && questStatusData.Status != QUEST_STATUS_NONE)
6287 {
6288 SetQuestSlot(slot, quest_id, uint32(quest_time)); // cast can't be helped
6289
6290 if (questStatusData.Status == QUEST_STATUS_COMPLETE)
6292 else if (questStatusData.Status == QUEST_STATUS_FAILED)
6294
6295 for (uint8 idx = 0; idx < QUEST_OBJECTIVES_COUNT; ++idx)
6296 if (questStatusData.CreatureOrGOCount[idx])
6297 SetQuestSlotCounter(slot, idx, questStatusData.CreatureOrGOCount[idx]);
6298
6299 if (questStatusData.PlayerCount)
6300 SetQuestSlotCounter(slot, QUEST_PVP_KILL_SLOT, questStatusData.PlayerCount);
6301
6302 ++slot;
6303 }
6304
6305 LOG_DEBUG("entities.player.loading", "Quest status is {{}} for quest {{}} for player ({})", questStatusData.Status, quest_id, GetGUID().ToString());
6306 }
6307 } while (result->NextRow());
6308 }
6309
6310 // clear quest log tail
6311 for (uint16 i = slot; i < MAX_QUEST_LOG_SIZE; ++i)
6312 SetQuestSlot(i, 0);
6313}
@ QUEST_STATE_COMPLETE
Definition: Player.h:639
@ QUEST_STATE_FAIL
Definition: Player.h:640
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition: QuestDef.h:36
#define QUEST_OBJECTIVES_COUNT
Definition: QuestDef.h:35
#define MAX_QUEST_LOG_SIZE
Definition: QuestDef.h:33
#define QUEST_PVP_KILL_SLOT
Definition: QuestDef.h:43
QuestStatus
Definition: QuestDef.h:99
@ QUEST_STATUS_FAILED
Definition: QuestDef.h:105
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:103
@ QUEST_STATUS_NONE
Definition: QuestDef.h:100
@ MAX_QUEST_STATUS
Definition: QuestDef.h:107
@ QUEST_STATUS_COMPLETE
Definition: QuestDef.h:101
@ QUEST_SPECIAL_FLAGS_TIMED
Definition: QuestDef.h:178
QuestStatusMap m_QuestStatus
Definition: Player.h:2808
bool GetQuestRewardStatus(uint32 quest_id) const
Definition: PlayerQuest.cpp:1415
void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count)
Definition: Player.h:1507
void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer=0)
Definition: Player.h:1499
void SetQuestSlotState(uint16 slot, uint32 state)
Definition: Player.h:1514
void AddTimedQuest(uint32 quest_id)
Definition: Player.h:1566
Definition: QuestDef.h:407
uint32 Timer
Definition: QuestDef.h:415
uint16 PlayerCount
Definition: QuestDef.h:418
uint16 ItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:416
QuestStatus Status
Definition: QuestDef.h:414
bool Explored
Definition: QuestDef.h:419
uint16 CreatureOrGOCount[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:417

References AddTimedQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), WorldObject::GetName(), GetQuestRewardStatus(), IN_MILLISECONDS, QuestStatusData::ItemCount, LOG_DEBUG, LOG_ERROR, m_QuestStatus, MAX_QUEST_LOG_SIZE, MAX_QUEST_STATUS, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_PVP_KILL_SLOT, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_COMPLETE, QUEST_STATE_FAIL, QUEST_STATUS_COMPLETE, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SetQuestSlot(), SetQuestSlotCounter(), SetQuestSlotState(), sObjectMgr, QuestStatusData::Status, QuestStatusData::Timer, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadQuestStatusRewarded()

void Player::_LoadQuestStatusRewarded ( PreparedQueryResult  result)
protected
6316{
6317 // SELECT quest FROM character_queststatus_rewarded WHERE guid = ?
6318
6319 if (result)
6320 {
6321 m_RewardedQuests.rehash(result->GetRowCount());
6322 do
6323 {
6324 Field* fields = result->Fetch();
6325
6326 uint32 quest_id = fields[0].Get<uint32>();
6327 // used to be new, no delete?
6328 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6329 if (quest)
6330 {
6331 // learn rewarded spell if unknown
6333
6334 // set rewarded title if any
6335 if (quest->GetCharTitleId())
6336 {
6337 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
6338 SetTitle(titleEntry);
6339 }
6340
6341 if (quest->GetBonusTalents())
6342 m_questRewardTalentCount += quest->GetBonusTalents();
6343 }
6344
6345 m_RewardedQuests.insert(quest_id);
6346 } while (result->NextRow());
6347 }
6348}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
RewardedQuestSet m_RewardedQuests
Definition: Player.h:2811
void SetTitle(CharTitlesEntry const *title, bool lost=false)
Definition: Player.cpp:13280
void learnQuestRewardedSpells()
Definition: Player.cpp:11927
Definition: DBCStructure.h:632

References Field::Get(), learnQuestRewardedSpells(), m_questRewardTalentCount, m_RewardedQuests, sCharTitlesStore, SetTitle(), and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadRandomBGStatus()

void Player::_LoadRandomBGStatus ( PreparedQueryResult  result)
protected
15659{
15660 if (result)
15661 m_IsBGRandomWinner = true;
15662}

References m_IsBGRandomWinner.

Referenced by LoadFromDB().

◆ _LoadSeasonalQuestStatus()

void Player::_LoadSeasonalQuestStatus ( PreparedQueryResult  result)
protected
6424{
6425 m_seasonalquests.clear();
6426
6427 if (result)
6428 {
6429 do
6430 {
6431 Field* fields = result->Fetch();
6432 uint32 quest_id = fields[0].Get<uint32>();
6433 uint32 event_id = fields[1].Get<uint32>();
6434 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6435 if (!quest)
6436 continue;
6437
6438 m_seasonalquests[event_id].insert(quest_id);
6439 LOG_DEBUG("entities.player.loading", "Seasonal quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6440 } while (result->NextRow());
6441 }
6442
6443 m_SeasonalQuestChanged = false;
6444}
SeasonalEventQuestMap m_seasonalquests
Definition: Player.h:2710

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_SeasonalQuestChanged, m_seasonalquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSkills()

void Player::_LoadSkills ( PreparedQueryResult  result)
protected
13618{
13619 // 0 1 2
13620 // SetQuery(PLAYER_LOGIN_QUERY_LOADSKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = '{}'", m_guid.GetCounter());
13621
13622 uint32 count = 0;
13623 std::unordered_map<uint32, uint32> loadedSkillValues;
13624 if (result)
13625 {
13626 do
13627 {
13628 Field* fields = result->Fetch();
13629 uint16 skill = fields[0].Get<uint16>();
13630 uint16 value = fields[1].Get<uint16>();
13631 uint16 max = fields[2].Get<uint16>();
13632
13633 SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass());
13634 if (!rcEntry)
13635 {
13636 LOG_ERROR("entities.player", "Character {} has skill {} that does not exist.", GetGUID().ToString(), skill);
13637 continue;
13638 }
13639
13640 // set fixed skill ranges
13641 switch (GetSkillRangeType(rcEntry))
13642 {
13643 case SKILL_RANGE_LANGUAGE: // 300..300
13644 value = max = 300;
13645 break;
13646 case SKILL_RANGE_MONO: // 1..1, grey monolite bar
13647 value = max = 1;
13648 break;
13649 case SKILL_RANGE_LEVEL:
13651 default:
13652 break;
13653 }
13654
13655 if (value == 0)
13656 {
13657 LOG_ERROR("entities.player", "Character {} has skill {} with value 0. Will be deleted.", GetGUID().ToString(), skill);
13658
13660
13661 stmt->SetData(0, GetGUID().GetCounter());
13662 stmt->SetData(1, skill);
13663
13664 CharacterDatabase.Execute(stmt);
13665
13666 continue;
13667 }
13668
13669 uint16 skillStep = 0;
13670 if (SkillTiersEntry const* skillTier = sSkillTiersStore.LookupEntry(rcEntry->SkillTierID))
13671 {
13672 for (uint32 i = 0; i < MAX_SKILL_STEP; ++i)
13673 {
13674 if (skillTier->Value[skillStep] == max)
13675 {
13676 skillStep = i + 1;
13677 break;
13678 }
13679 }
13680 }
13681
13682 SetUInt32Value(PLAYER_SKILL_INDEX(count), MAKE_PAIR32(skill, skillStep));
13683
13686
13687 mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(count, SKILL_UNCHANGED)));
13688
13689 loadedSkillValues[skill] = value;
13690
13691 ++count;
13692
13693 if (count >= PLAYER_MAX_SKILLS) // client limit
13694 {
13695 LOG_ERROR("entities.player", "Character {} has more than {} skills.", GetGUID().ToString(), PLAYER_MAX_SKILLS);
13696 break;
13697 }
13698 } while (result->NextRow());
13699 }
13700
13701 // Learn skill rewarded spells after all skills have been loaded to prevent learning a skill from them before its loaded with proper value from DB
13702 for (auto& skill : loadedSkillValues)
13703 {
13704 learnSkillRewardedSpells(skill.first, skill.second);
13705 }
13706
13707 for (; count < PLAYER_MAX_SKILLS; ++count)
13708 {
13712 }
13713}
SkillRaceClassInfoEntry const * GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_)
Definition: DBCStores.cpp:895
DBCStorage< SkillTiersEntry > sSkillTiersStore(SkillTiersfmt)
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition: ObjectDefines.h:87
#define PLAYER_SKILL_BONUS_INDEX(x)
Definition: Player.h:80
#define PLAYER_SKILL_VALUE_INDEX(x)
Definition: Player.h:79
#define PLAYER_SKILL_INDEX(x)
Definition: Player.h:78
#define PLAYER_MAX_SKILLS
Definition: Player.h:70
@ SKILL_UNCHANGED
Definition: Player.h:645
#define MAKE_SKILL_VALUE(v, m)
Definition: Player.h:84
@ SKILL_RANGE_MONO
Definition: ObjectMgr.h:675
@ SKILL_RANGE_LANGUAGE
Definition: ObjectMgr.h:673
@ SKILL_RANGE_LEVEL
Definition: ObjectMgr.h:674
SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const *rcEntry)
Definition: ObjectMgr.cpp:9037
@ CHAR_DEL_CHARACTER_SKILL
Definition: CharacterDatabase.h:318
#define MAX_SKILL_STEP
Definition: DBCStructure.h:1581
Definition: Player.h:652
SkillStatusMap mSkillStatus
Definition: Player.h:2815
void learnSkillRewardedSpells(uint32 id, uint32 value)
Definition: Player.cpp:11940
Definition: DBCStructure.h:1570
Definition: DBCStructure.h:1616

References CHAR_DEL_CHARACTER_SKILL, CharacterDatabase, Field::Get(), Unit::getClass(), Object::GetGUID(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, MAX_SKILL_STEP, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), Unit::SetUInt32Value(), SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_UNCHANGED, sSkillTiersStore, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpellCooldowns()

void Player::_LoadSpellCooldowns ( PreparedQueryResult  result)
3588{
3589 // some cooldowns can be already set at aura loading...
3590
3591 //QueryResult* result = CharacterDatabase.Query("SELECT spell, category, item, time FROM character_spell_cooldown WHERE guid = '{}'", GetGUID().GetCounter()());
3592
3593 if (result)
3594 {
3595 time_t curTime = GameTime::GetGameTime().count();
3596
3597 do
3598 {
3599 Field* fields = result->Fetch();
3600 uint32 spell_id = fields[0].Get<uint32>();
3601 uint16 category = fields[1].Get<uint16>();
3602 uint32 item_id = fields[2].Get<uint32>();
3603 uint32 db_time = fields[3].Get<uint32>();
3604 bool needSend = fields[4].Get<bool>();
3605
3606 if (!sSpellMgr->GetSpellInfo(spell_id))
3607 {
3608 LOG_ERROR("entities.player", "Player {} has unknown spell {} in `character_spell_cooldown`, skipping.", GetGUID().ToString(), spell_id);
3609 continue;
3610 }
3611
3612 // skip outdated cooldown
3613 if (db_time <= curTime)
3614 continue;
3615
3616 _AddSpellCooldown(spell_id, category, item_id, (db_time - curTime) * IN_MILLISECONDS, needSend);
3617
3618 LOG_DEBUG("entities.player.loading", "Player ({}) spell {}, item {} cooldown loaded ({} secs).", GetGUID().ToString(), spell_id, item_id, uint32(db_time - curTime));
3619 } while (result->NextRow());
3620 }
3621}
void _AddSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Player.cpp:11014

References _AddSpellCooldown(), Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, sSpellMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpells()

void Player::_LoadSpells ( PreparedQueryResult  result)
protected
6469{
6470 //QueryResult* result = CharacterDatabase.Query("SELECT spell, specMask FROM character_spell WHERE guid = '{}'", GetGUID().GetCounter());
6471
6472 if (result)
6473 {
6474 do
6475 // xinef: checked
6476 addSpell((*result)[0].Get<uint32>(), (*result)[1].Get<uint8>(), true);
6477 while (result->NextRow());
6478 }
6479}
bool addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
Definition: Player.cpp:3056

References addSpell().

Referenced by LoadFromDB().

◆ _LoadTalents()

void Player::_LoadTalents ( PreparedQueryResult  result)
protected
14949{
14950 // SetQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, specMask FROM character_talent WHERE guid = '{}'", m_guid.GetCounter());
14951 if (result)
14952 {
14953 do
14954 {
14955 // xinef: checked
14956 uint32 spellId = (*result)[0].Get<uint32>();
14957 uint8 specMask = (*result)[1].Get<uint8>();
14958 addTalent(spellId, specMask, 0);
14959 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
14960 ASSERT(talentPos);
14961
14962 } while (result->NextRow());
14963 }
14964}
TalentSpellPos const * GetTalentSpellPos(uint32 spellId)
Definition: DBCStores.cpp:677
#define ASSERT
Definition: Errors.h:68
bool addTalent(uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
Definition: Player.cpp:2905
Definition: DBCStructure.h:2233

References addTalent(), ASSERT, and GetTalentSpellPos().

Referenced by LoadFromDB().

◆ _LoadWeeklyQuestStatus()

void Player::_LoadWeeklyQuestStatus ( PreparedQueryResult  result)
protected
6402{
6403 m_weeklyquests.clear();
6404
6405 if (result)
6406 {
6407 do
6408 {
6409 Field* fields = result->Fetch();
6410 uint32 quest_id = fields[0].Get<uint32>();
6411 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6412 if (!quest)
6413 continue;
6414
6415 m_weeklyquests.insert(quest_id);
6416 LOG_DEBUG("entities.player.loading", "Weekly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6417 } while (result->NextRow());
6418 }
6419
6420 m_WeeklyQuestChanged = false;
6421}
QuestSet m_weeklyquests
Definition: Player.h:2708

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_WeeklyQuestChanged, m_weeklyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _RemoveAllItemMods()

void Player::_RemoveAllItemMods ( )
7515{
7516 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods start.");
7517
7518 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7519 {
7520 if (m_items[i])
7521 {
7522 ItemTemplate const* proto = m_items[i]->GetTemplate();
7523 if (!proto)
7524 continue;
7525
7526 // item set bonuses not dependent from item broken state
7527 if (proto->ItemSet)
7528 RemoveItemsSetItem(this, proto);
7529
7530 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7531 continue;
7532
7533 ApplyItemEquipSpell(m_items[i], false);
7534 ApplyEnchantment(m_items[i], false);
7535 }
7536 }
7537
7538 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7539 {
7540 if (m_items[i])
7541 {
7542 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7543 continue;
7544 ItemTemplate const* proto = m_items[i]->GetTemplate();
7545 if (!proto)
7546 continue;
7547
7548 uint32 attacktype = Player::GetAttackBySlot(i);
7549 if (attacktype < MAX_ATTACK)
7551
7552 _ApplyItemBonuses(proto, i, false);
7553
7554 if (i == EQUIPMENT_SLOT_RANGED)
7556 }
7557 }
7558
7559 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods complete.");
7560}
void RemoveItemsSetItem(Player *player, ItemTemplate const *proto)
Definition: Item.cpp:118

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_ATTACK, and RemoveItemsSetItem().

Referenced by _RemoveAllStatBonuses().

◆ _RemoveAllStatBonuses()

void Player::_RemoveAllStatBonuses ( )
1004{
1005 SetCanModifyStats(false);
1006
1009
1010 SetCanModifyStats(true);
1011
1013}
void _RemoveAllItemMods()
Definition: Player.cpp:7514
void _RemoveAllAuraStatMods()
Definition: Unit.cpp:5515

References Unit::_RemoveAllAuraStatMods(), _RemoveAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _removeTalent() [1/2]

void Player::_removeTalent ( PlayerTalentMap::iterator &  itr,
uint8  specMask 
)
2976{
2977 // xinef: remove spec mask from iterator
2978 itr->second->specMask &= ~specMask;
2979
2980 // xinef: if talent is not present in any spec - remove
2981 if (itr->second->specMask == 0)
2982 {
2983 if (itr->second->State == PLAYERSPELL_NEW)
2984 {
2985 delete itr->second;
2986 m_talents.erase(itr);
2987 return;
2988 }
2989 else
2990 itr->second->State = PLAYERSPELL_REMOVED;
2991 }
2992 // xinef: otherwise save changes to DB
2993 else if (itr->second->State != PLAYERSPELL_NEW)
2994 itr->second->State = PLAYERSPELL_CHANGED;
2995}

References m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, and PLAYERSPELL_REMOVED.

Referenced by _removeTalent(), addTalent(), and resetTalents().

◆ _removeTalent() [2/2]

void Player::_removeTalent ( uint32  spellId,
uint8  specMask 
)
2967{
2968 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2969 if (itr == m_talents.end() || itr->second->State == PLAYERSPELL_REMOVED)
2970 return;
2971
2972 _removeTalent(itr, specMask);
2973}
void _removeTalent(PlayerTalentMap::iterator &itr, uint8 specMask)
Definition: Player.cpp:2975

References _removeTalent(), m_talents, and PLAYERSPELL_REMOVED.

◆ _removeTalentAurasAndSpells()

void Player::_removeTalentAurasAndSpells ( uint32  spellId)
2998{
2999 RemoveOwnedAura(spellId);
3000
3001 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3002 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3003 {
3004 // pussywizard: remove pet auras
3005 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spellId, i))
3006 RemovePetAura(petSpell);
3007
3008 // pussywizard: remove all triggered auras
3009 if (spellInfo->Effects[i].TriggerSpell > 0)
3010 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3011
3012 // xinef: remove temporary spells added by talent
3013 // xinef: recursively remove all learnt spells
3014 if (spellInfo->Effects[i].TriggerSpell > 0 && spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3015 {
3016 removeSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
3017 _removeTalentAurasAndSpells(spellInfo->Effects[i].TriggerSpell);
3018 }
3019 }
3020}
void removeSpell(uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
Definition: Player.cpp:3332
void _removeTalentAurasAndSpells(uint32 spellId)
Definition: Player.cpp:2997
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4738
void RemovePetAura(PetAura const *petSpell)
Definition: Unit.cpp:17342
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4942
Definition: SpellMgr.h:470

References _removeTalentAurasAndSpells(), SpellInfo::Effects, MAX_SPELL_EFFECTS, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SPEC_MASK_ALL, SPELL_EFFECT_LEARN_SPELL, and sSpellMgr.

Referenced by _removeTalentAurasAndSpells(), ActivateSpec(), addTalent(), and resetTalents().

◆ _SaveActions()

void Player::_SaveActions ( CharacterDatabaseTransaction  trans)
protected
7136{
7137 CharacterDatabasePreparedStatement* stmt = nullptr;
7138
7139 for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();)
7140 {
7141 switch (itr->second.uState)
7142 {
7143 case ACTIONBUTTON_NEW:
7144 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
7145 stmt->SetData(0, GetGUID().GetCounter());
7146 stmt->SetData(1, m_activeSpec);
7147 stmt->SetData(2, itr->first);
7148 stmt->SetData(3, itr->second.GetAction());
7149 stmt->SetData(4, uint8(itr->second.GetType()));
7150 trans->Append(stmt);
7151
7152 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7153 ++itr;
7154 break;
7156 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACTION);
7157 stmt->SetData(0, itr->second.GetAction());
7158 stmt->SetData(1, uint8(itr->second.GetType()));
7159 stmt->SetData(2, GetGUID().GetCounter());
7160 stmt->SetData(3, itr->first);
7161 stmt->SetData(4, m_activeSpec);
7162 trans->Append(stmt);
7163
7164 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7165 ++itr;
7166 break;
7168 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC);
7169 stmt->SetData(0, GetGUID().GetCounter());
7170 stmt->SetData(1, itr->first);
7171 stmt->SetData(2, m_activeSpec);
7172 trans->Append(stmt);
7173
7174 m_actionButtons.erase(itr++);
7175 break;
7176 default:
7177 ++itr;
7178 break;
7179 }
7180 }
7181}
@ ACTIONBUTTON_NEW
Definition: Player.h:224
@ ACTIONBUTTON_CHANGED
Definition: Player.h:223
@ CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC
Definition: CharacterDatabase.h:434
@ CHAR_UPD_CHAR_ACTION
Definition: CharacterDatabase.h:433
@ CHAR_INS_CHAR_ACTION
Definition: CharacterDatabase.h:432

References ACTIONBUTTON_CHANGED, ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, ACTIONBUTTON_UNCHANGED, CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, CHAR_INS_CHAR_ACTION, CHAR_UPD_CHAR_ACTION, CharacterDatabase, Object::GetGUID(), m_actionButtons, m_activeSpec, and PreparedStatementBase::SetData().

Referenced by ActivateSpec(), SaveToDB(), and UpdateSpecCount().

◆ _SaveAuras()

void Player::_SaveAuras ( CharacterDatabaseTransaction  trans,
bool  logout 
)
protected
7184{
7186 stmt->SetData(0, GetGUID().GetCounter());
7187 trans->Append(stmt);
7188
7189 for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr)
7190 {
7191 if (!itr->second->CanBeSaved())
7192 continue;
7193
7194 Aura* aura = itr->second;
7195 if (!logout && aura->GetDuration() < 60 * IN_MILLISECONDS )
7196 continue;
7197
7198 int32 damage[MAX_SPELL_EFFECTS];
7199 int32 baseDamage[MAX_SPELL_EFFECTS];
7200 uint8 effMask = 0;
7201 uint8 recalculateMask = 0;
7202 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
7203 {
7204 if (AuraEffect const* effect = aura->GetEffect(i))
7205 {
7206 baseDamage[i] = effect->GetBaseAmount();
7207 damage[i] = effect->GetAmount();
7208 effMask |= 1 << i;
7209 if (effect->CanBeRecalculated())
7210 recalculateMask |= 1 << i;
7211 }
7212 else
7213 {
7214 baseDamage[i] = 0;
7215 damage[i] = 0;
7216 }
7217 }
7218
7219 uint8 index = 0;
7220 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA);
7221 stmt->SetData(index++, GetGUID().GetCounter());
7222 stmt->SetData(index++, itr->second->GetCasterGUID().GetRawValue());
7223 stmt->SetData(index++, itr->second->GetCastItemGUID().GetRawValue());
7224 stmt->SetData(index++, itr->second->GetId());
7225 stmt->SetData(index++, effMask);
7226 stmt->SetData(index++, recalculateMask);
7227 stmt->SetData(index++, itr->second->GetStackAmount());
7228 stmt->SetData(index++, damage[0]);
7229 stmt->SetData(index++, damage[1]);
7230 stmt->SetData(index++, damage[2]);
7231 stmt->SetData(index++, baseDamage[0]);
7232 stmt->SetData(index++, baseDamage[1]);
7233 stmt->SetData(index++, baseDamage[2]);
7234 stmt->SetData(index++, itr->second->GetMaxDuration());
7235 stmt->SetData(index++, itr->second->GetDuration());
7236 stmt->SetData(index, itr->second->GetCharges());
7237 trans->Append(stmt);
7238 }
7239}
@ CHAR_INS_AURA
Definition: CharacterDatabase.h:196
@ CHAR_DEL_CHAR_AURA
Definition: CharacterDatabase.h:409
AuraMap m_ownedAuras
Definition: Unit.h:2070
Definition: SpellAuraEffects.h:39
int32 GetDuration() const
Definition: SpellAuras.h:133
AuraEffect * GetEffect(uint8 effIndex) const
Definition: SpellAuras.h:175

References CHAR_DEL_CHAR_AURA, CHAR_INS_AURA, CharacterDatabase, Aura::GetDuration(), Aura::GetEffect(), Object::GetGUID(), IN_MILLISECONDS, Unit::m_ownedAuras, MAX_SPELL_EFFECTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB(), and SpawnCorpseBones().

◆ _SaveCharacter()

void Player::_SaveCharacter ( bool  create,
CharacterDatabaseTransaction  trans 
)
protected

Insert query TO DO: Filter out more redundant fields that can take their default value at player create

14624{
14625 CharacterDatabasePreparedStatement* stmt = nullptr;
14626 uint8 index = 0;
14627
14628 auto finiteAlways = [](float f) { return std::isfinite(f) ? f : 0.0f; };
14629
14630 if (create)
14631 {
14634 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER);
14635 stmt->SetData(index++, GetGUID().GetCounter());
14636 stmt->SetData(index++, GetSession()->GetAccountId());
14637 stmt->SetData(index++, GetName());
14638 stmt->SetData(index++, getRace(true));
14639 stmt->SetData(index++, getClass());
14640 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14641 stmt->SetData(index++, GetLevel());
14642 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14643 stmt->SetData(index++, GetMoney());
14644 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14645 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14646 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14647 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14648 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14649 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14650 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14651 stmt->SetData(index++, (uint32)GetPlayerFlags());
14652 stmt->SetData(index++, (uint16)GetMapId());
14653 stmt->SetData(index++, (uint32)GetInstanceId());
14654 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14655 stmt->SetData(index++, finiteAlways(GetPositionX()));
14656 stmt->SetData(index++, finiteAlways(GetPositionY()));
14657 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14658 stmt->SetData(index++, finiteAlways(GetOrientation()));
14659 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14660 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14661 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14662 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14663
14664 int32 lowGuidOrSpawnId = 0;
14665 if (Transport* transport = GetTransport())
14666 {
14667 if (transport->IsMotionTransport())
14668 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14669 else if (transport->IsStaticTransport())
14670 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14671 }
14672 stmt->SetData(index++, lowGuidOrSpawnId);
14673
14674 std::ostringstream ss;
14675 ss << m_taxi;
14676 stmt->SetData(index++, ss.str());
14677 stmt->SetData(index++, m_cinematic);
14678 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14679 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14680 stmt->SetData(index++, finiteAlways(_restBonus));
14681 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14682 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14683 //save, far from tavern/city
14684 //save, but in tavern/city
14685 stmt->SetData(index++, m_resetTalentsCost);
14686 stmt->SetData(index++, uint32(m_resetTalentsTime));
14687 stmt->SetData(index++, (uint16)m_ExtraFlags);
14688 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14689 stmt->SetData(index++, (uint16)m_atLoginFlags);
14690 stmt->SetData(index++, GetZoneId());
14691 stmt->SetData(index++, uint32(m_deathExpireTime));
14692
14693 ss.str("");
14695
14696 stmt->SetData(index++, ss.str());
14697 stmt->SetData(index++, GetArenaPoints());
14698 stmt->SetData(index++, GetHonorPoints());
14702 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14703 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14707 stmt->SetData(index++, GetDrunkValue());
14708 stmt->SetData(index++, GetHealth());
14709
14710 for (uint32 i = 0; i < MAX_POWERS; ++i)
14711 stmt->SetData(index++, GetPower(Powers(i)));
14712
14713 stmt->SetData(index++, GetSession()->GetLatency());
14714
14715 stmt->SetData(index++, m_specsCount);
14716 stmt->SetData(index++, m_activeSpec);
14717
14718 ss.str("");
14719 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14720 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14721 stmt->SetData(index++, ss.str());
14722
14723 ss.str("");
14724 // cache equipment...
14725 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14727
14728 // ...and bags for enum opcode
14730 {
14731 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14732 ss << item->GetEntry();
14733 else
14734 ss << '0';
14735 ss << " 0 ";
14736 }
14737
14738 stmt->SetData(index++, ss.str());
14739 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14740
14741 ss.str("");
14742 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14744
14745 stmt->SetData(index++, ss.str());
14746 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14747 stmt->SetData(index++, m_grantableLevels);
14748 stmt->SetData(index++, _innTriggerId);
14749 stmt->SetData(index++, m_extraBonusTalentCount);
14750 }
14751 else
14752 {
14753 // Update query
14754 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER);
14755 stmt->SetData(index++, GetName());
14756 stmt->SetData(index++, getRace(true));
14757 stmt->SetData(index++, getClass());
14758 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14759 stmt->SetData(index++, GetLevel());
14760 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14761 stmt->SetData(index++, GetMoney());
14762 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14763 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14764 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14765 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14766 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14767 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14768 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14769 stmt->SetData(index++, GetPlayerFlags());
14770
14771 if (!IsBeingTeleported())
14772 {
14774 if (Map* m = FindMap())
14775 if (m->IsDungeon())
14776 {
14777 if (m->IsNonRaidDungeon()) dd = m->GetDifficulty();
14778 else rd = m->GetDifficulty();
14779 }
14780 stmt->SetData(index++, (uint16)GetMapId());
14781 stmt->SetData(index++, (uint32)GetInstanceId());
14782 stmt->SetData(index++, (uint8(dd) | uint8(rd) << 4));
14783 stmt->SetData(index++, finiteAlways(GetPositionX()));
14784 stmt->SetData(index++, finiteAlways(GetPositionY()));
14785 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14786 stmt->SetData(index++, finiteAlways(GetOrientation()));
14787 }
14788 else
14789 {
14790 stmt->SetData(index++, (uint16)GetTeleportDest().GetMapId());
14791 stmt->SetData(index++, (uint32)0);
14792 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14793 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionX()));
14794 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionY()));
14795 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionZ()));
14796 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetOrientation()));
14797 }
14798
14799 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14800 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14801 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14802 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14803
14804 int32 lowGuidOrSpawnId = 0;
14805 if (Transport* transport = GetTransport())
14806 {
14807 if (transport->IsMotionTransport())
14808 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14809 else if (transport->IsStaticTransport())
14810 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14811 }
14812 stmt->SetData(index++, lowGuidOrSpawnId);
14813
14814 std::ostringstream ss;
14815 ss << m_taxi;
14816 stmt->SetData(index++, ss.str());
14817 stmt->SetData(index++, m_cinematic);
14818 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14819 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14820 stmt->SetData(index++, finiteAlways(_restBonus));
14821 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14822 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14823 //save, far from tavern/city
14824 //save, but in tavern/city
14825 stmt->SetData(index++, m_resetTalentsCost);
14826 stmt->SetData(index++, uint32(m_resetTalentsTime));
14827 stmt->SetData(index++, (uint16)m_ExtraFlags);
14828 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14829 stmt->SetData(index++, (uint16)m_atLoginFlags);
14830 stmt->SetData(index++, GetZoneId());
14831 stmt->SetData(index++, uint32(m_deathExpireTime));
14832
14833 ss.str("");
14835
14836 stmt->SetData(index++, ss.str());
14837 stmt->SetData(index++, GetArenaPoints());
14838 stmt->SetData(index++, GetHonorPoints());
14842 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14843 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14847 stmt->SetData(index++, GetDrunkValue());
14848 stmt->SetData(index++, GetHealth());
14849
14850 for (uint32 i = 0; i < MAX_POWERS; ++i)
14851 stmt->SetData(index++, GetPower(Powers(i)));
14852
14853 stmt->SetData(index++, GetSession()->GetLatency());
14854
14855 stmt->SetData(index++, m_specsCount);
14856 stmt->SetData(index++, m_activeSpec);
14857
14858 ss.str("");
14859 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14860 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14861 stmt->SetData(index++, ss.str());
14862
14863 ss.str("");
14864 // cache equipment...
14865 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14867
14868 // ...and bags for enum opcode
14870 {
14871 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14872 ss << item->GetEntry();
14873 else
14874 ss << '0';
14875 ss << " 0 ";
14876 }
14877
14878 stmt->SetData(index++, ss.str());
14879 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14880
14881 ss.str("");
14882 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14884
14885 stmt->SetData(index++, ss.str());
14886 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14887 stmt->SetData(index++, m_grantableLevels);
14888 stmt->SetData(index++, _innTriggerId);
14889 stmt->SetData(index++, m_extraBonusTalentCount);
14890
14891 stmt->SetData(index++, IsInWorld() && !GetSession()->PlayerLogout() ? 1 : 0);
14892 // Index
14893 stmt->SetData(index++, GetGUID().GetCounter());
14894 }
14895
14896 trans->Append(stmt);
14897}
@ PLAYER_FIELD_TODAY_CONTRIBUTION
Definition: UpdateFields.h:375
@ PLAYER_BYTES_3
Definition: UpdateFields.h:183
@ PLAYER_XP
Definition: UpdateFields.h:339
@ PLAYER_CHOSEN_TITLE
Definition: UpdateFields.h:324
@ PLAYER_EXPLORED_ZONES_1
Definition: UpdateFields.h:357
@ PLAYER_FIELD_KNOWN_CURRENCIES
Definition: UpdateFields.h:338
@ PLAYER_BYTES_2
Definition: UpdateFields.h:182
@ PLAYER__FIELD_KNOWN_TITLES
Definition: UpdateFields.h:335
@ PLAYER_BYTES
Definition: UpdateFields.h:181
@ PLAYER_FIELD_KILLS
Definition: UpdateFields.h:374
@ PLAYER_FIELD_YESTERDAY_CONTRIBUTION
Definition: UpdateFields.h:376
@ PLAYER_FIELD_WATCHED_FACTION_INDEX
Definition: UpdateFields.h:379
@ PLAYER_VISIBLE_ITEM_1_ENTRYID
Definition: UpdateFields.h:286
@ PLAYER_FIELD_LIFETIME_HONORABLE_KILLS
Definition: UpdateFields.h:377
@ PLAYER_FIELD_BYTES
Definition: UpdateFields.h:368
#define KNOWN_TITLES_SIZE
Definition: Player.h:559
@ PLAYER_FLAGS_RESTING
Definition: Player.h:485
@ INVENTORY_SLOT_BAG_START
Definition: Player.h:705
#define PLAYER_EXPLORED_ZONES_SIZE
Definition: Player.h:72
@ CHAR_INS_CHARACTER
Definition: CharacterDatabase.h:273
@ CHAR_UPD_CHARACTER
Definition: CharacterDatabase.h:274
Difficulty
Definition: DBCEnums.h:266
Powers
Definition: SharedDefines.h:268
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition: Object.cpp:323
uint16 GetUInt16Value(uint16 index, uint8 offset) const
Definition: Object.cpp:330
uint64 GetUInt64Value(uint16 index) const
Definition: Object.cpp:311
float GetTransOffsetX() const
Definition: Object.h:599
uint32 GetInstanceId() const
Definition: Object.h:449
float GetTransOffsetY() const
Definition: Object.h:600
float GetTransOffsetZ() const
Definition: Object.h:601
Transport * GetTransport() const
Definition: Object.h:598
float GetTransOffsetO() const
Definition: Object.h:602
float GetPositionZ() const
Definition: Position.h:123
float GetOrientation() const
Definition: Position.h:124
float GetPositionX() const
Definition: Position.h:121
float GetPositionY() const
Definition: Position.h:122
Difficulty GetRaidDifficulty() const
Definition: Player.h:1930
WorldLocation & GetTeleportDest()
Definition: Player.h:2099
uint32 GetArenaPoints() const
Definition: Player.h:2163
uint8 GetDrunkValue() const
Definition: Player.h:2181
Item * GetItemByPos(uint16 pos) const
Definition: PlayerStorage.cpp:441
uint32 GetHonorPoints() const
Definition: Player.h:2162
PlayerFlags GetPlayerFlags() const
Definition: Player.h:1125
uint32 GetMoney() const
Definition: Player.h:1617
PlayerTaxi m_taxi
Definition: Player.h:1161
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1126
Difficulty GetDungeonDifficulty() const
Definition: Player.h:1929
bool IsBeingTeleported() const
Definition: Player.h:2100
std::string SaveTaxiDestinationsToString()
Definition: PlayerTaxi.cpp:193
Definition: Transport.h:30
uint32 GetHealth() const
Definition: Unit.h:1029
uint32 GetPower(Powers power) const
Definition: Unit.h:1056
Definition: Map.h:156
bool PlayerLogout() const
Definition: WorldSession.h:338
uint32 GetLatency() const
Definition: WorldSession.h:516

References _innTriggerId, _restBonus, CHAR_INS_CHARACTER, CHAR_UPD_CHARACTER, CharacterDatabase, EQUIPMENT_SLOT_END, WorldObject::FindMap(), GetArenaPoints(), Object::GetByteValue(), Unit::getClass(), ObjectGuid::GetCounter(), GetDrunkValue(), GetDungeonDifficulty(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetHealth(), GetHonorPoints(), WorldObject::GetInstanceId(), GetItemByPos(), WorldSession::GetLatency(), Unit::GetLevel(), WorldLocation::GetMapId(), GetMoney(), WorldObject::GetName(), Position::GetOrientation(), GetPlayerFlags(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Unit::GetPower(), Unit::getRace(), GetRaidDifficulty(), GetSession(), GetTeleportDest(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), Object::GetUInt16Value(), Object::GetUInt32Value(), Object::GetUInt64Value(), WorldObject::GetZoneId(), HasPlayerFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, IsBeingTeleported(), Object::IsInWorld(), KNOWN_TITLES_SIZE, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, m_extraBonusTalentCount, m_ExtraFlags, m_grantableLevels, m_petStable, m_Played_time, m_resetTalentsCost, m_resetTalentsTime, m_specsCount, m_taxi, MAX_POWERS, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_FIELD_BYTES, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_RESTING, PLAYER_VISIBLE_ITEM_1_ENTRYID, PLAYER_XP, WorldSession::PlayerLogout(), PlayerTaxi::SaveTaxiDestinationsToString(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveDailyQuestStatus()

void Player::_SaveDailyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7522{
7524 return;
7525
7526 m_DailyQuestChanged = false;
7527
7528 // save last daily quest time for all quests: we need only mostly reset time for reset check anyway
7529
7530 // we don't need transactions here.
7532 stmt->SetData(0, GetGUID().GetCounter());
7533 trans->Append(stmt);
7534 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
7535 {
7536 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
7537 {
7538 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7539 stmt->SetData(0, GetGUID().GetCounter());
7540 stmt->SetData(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx));
7542 trans->Append(stmt);
7543 }
7544 }
7545
7546 if (!m_DFQuests.empty())
7547 {
7548 for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
7549 {
7550 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7551 stmt->SetData(0, GetGUID().GetCounter());
7552 stmt->SetData(1, (*itr));
7554 trans->Append(stmt);
7555 }
7556 }
7557}
@ CHAR_DEL_QUEST_STATUS_DAILY_CHAR
Definition: CharacterDatabase.h:59
@ CHAR_INS_CHARACTER_DAILYQUESTSTATUS
Definition: CharacterDatabase.h:74

References CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_INS_CHARACTER_DAILYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveEntryPoint()

void Player::_SaveEntryPoint ( CharacterDatabaseTransaction  trans)
protected
14541{
14542 // xinef: dont save joinpos with invalid mapid
14543 MapEntry const* mEntry = sMapStore.LookupEntry(m_entryPointData.joinPos.GetMapId());
14544 if (!mEntry)
14545 return;
14546
14548 stmt->SetData(0, GetGUID().GetCounter());
14549 trans->Append(stmt);
14550
14551 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_ENTRY_POINT);
14552 stmt->SetData(0, GetGUID().GetCounter());
14558 stmt->SetData(6, m_entryPointData.taxiPath[0]);
14559 stmt->SetData(7, m_entryPointData.taxiPath[1]);
14561 trans->Append(stmt);
14562}
@ CHAR_INS_PLAYER_ENTRY_POINT
Definition: CharacterDatabase.h:239
@ CHAR_DEL_PLAYER_ENTRY_POINT
Definition: CharacterDatabase.h:240

References CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_INS_PLAYER_ENTRY_POINT, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, PreparedStatementBase::SetData(), sMapStore, and EntryPointData::taxiPath.

Referenced by SaveToDB().

◆ _SaveEquipmentSets()

void Player::_SaveEquipmentSets ( CharacterDatabaseTransaction  trans)
protected
14490{
14491 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
14492 {
14493 uint32 index = itr->first;
14494 EquipmentSet& eqset = itr->second;
14495 CharacterDatabasePreparedStatement* stmt = nullptr;
14496 uint8 j = 0;
14497 switch (eqset.state)
14498 {
14500 ++itr;
14501 break; // nothing do
14503 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET);
14504 stmt->SetData(j++, eqset.Name.c_str());
14505 stmt->SetData(j++, eqset.IconName.c_str());
14506 stmt->SetData(j++, eqset.IgnoreMask);
14507 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14508 stmt->SetData(j++, eqset.Items[i].GetCounter());
14509 stmt->SetData(j++, GetGUID().GetCounter());
14510 stmt->SetData(j++, eqset.Guid);
14511 stmt->SetData(j, index);
14512 trans->Append(stmt);
14514 ++itr;
14515 break;
14516 case EQUIPMENT_SET_NEW:
14517 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET);
14518 stmt->SetData(j++, GetGUID().GetCounter());
14519 stmt->SetData(j++, eqset.Guid);
14520 stmt->SetData(j++, index);
14521 stmt->SetData(j++, eqset.Name.c_str());
14522 stmt->SetData(j++, eqset.IconName.c_str());
14523 stmt->SetData(j++, eqset.IgnoreMask);
14524 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14525 stmt->SetData(j++, eqset.Items[i].GetCounter());
14526 trans->Append(stmt);
14528 ++itr;
14529 break;
14531 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET);
14532 stmt->SetData(0, eqset.Guid);
14533 trans->Append(stmt);
14534 m_EquipmentSets.erase(itr++);
14535 break;
14536 }
14537 }
14538}
@ EQUIPMENT_SET_CHANGED
Definition: Player.h:749
@ EQUIPMENT_SET_DELETED
Definition: Player.h:751
@ EQUIPMENT_SET_NEW
Definition: Player.h:750
@ CHAR_UPD_EQUIP_SET
Definition: CharacterDatabase.h:192
@ CHAR_INS_EQUIP_SET
Definition: CharacterDatabase.h:193
@ CHAR_DEL_EQUIP_SET
Definition: CharacterDatabase.h:194

References CHAR_DEL_EQUIP_SET, CHAR_INS_EQUIP_SET, CHAR_UPD_EQUIP_SET, CharacterDatabase, EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, ObjectGuid::GetCounter(), Object::GetGUID(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, EquipmentSet::Name, PreparedStatementBase::SetData(), and EquipmentSet::state.

Referenced by SaveToDB().

◆ _SaveGlyphs()

void Player::_SaveGlyphs ( CharacterDatabaseTransaction  trans)
protected
14923{
14924 if (!NeedToSaveGlyphs())
14925 return;
14926
14928 stmt->SetData(0, GetGUID().GetCounter());
14929 trans->Append(stmt);
14930
14931 for (uint8 spec = 0; spec < m_specsCount; ++spec)
14932 {
14933 uint8 index = 0;
14934
14935 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS);
14936 stmt->SetData(index++, GetGUID().GetCounter());
14937 stmt->SetData(index++, spec);
14938
14939 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14940 stmt->SetData(index++, uint16(m_Glyphs[spec][i]));
14941
14942 trans->Append(stmt);
14943 }
14944
14945 SetNeedToSaveGlyphs(false);
14946}
@ CHAR_DEL_CHAR_GLYPHS
Definition: CharacterDatabase.h:422
@ CHAR_INS_CHAR_GLYPHS
Definition: CharacterDatabase.h:456
void SetNeedToSaveGlyphs(bool val)
Definition: Player.h:2612
bool NeedToSaveGlyphs()
Definition: Player.h:2611

References CHAR_DEL_CHAR_GLYPHS, CHAR_INS_CHAR_GLYPHS, CharacterDatabase, Object::GetGUID(), m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, NeedToSaveGlyphs(), PreparedStatementBase::SetData(), and SetNeedToSaveGlyphs().

Referenced by SaveToDB().

◆ _SaveInstanceTimeRestrictions()

void Player::_SaveInstanceTimeRestrictions ( CharacterDatabaseTransaction  trans)
protected
15813{
15814 if (_instanceResetTimes.empty())
15815 return;
15816
15818 stmt->SetData(0, GetSession()->GetAccountId());
15819 trans->Append(stmt);
15820
15821 for (InstanceTimeMap::const_iterator itr = _instanceResetTimes.begin(); itr != _instanceResetTimes.end(); ++itr)
15822 {
15823 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES);
15824 stmt->SetData(0, GetSession()->GetAccountId());
15825 stmt->SetData(1, itr->first);
15826 stmt->SetData(2, (int64)itr->second);
15827 trans->Append(stmt);
15828 }
15829}
@ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES
Definition: CharacterDatabase.h:133
@ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES
Definition: CharacterDatabase.h:134
std::int64_t int64
Definition: Define.h:102

References _instanceResetTimes, CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, CharacterDatabase, GetSession(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveInventory()

void Player::_SaveInventory ( CharacterDatabaseTransaction  trans)
protected
7242{
7243 CharacterDatabasePreparedStatement* stmt = nullptr;
7244 // force items in buyback slots to new state
7245 // and remove those that aren't already
7246 for (uint8 i = BUYBACK_SLOT_START; i < BUYBACK_SLOT_END; ++i)
7247 {
7248 Item* item = m_items[i];
7249 if (!item)
7250 continue;
7251
7252 if (item->GetState() == ITEM_NEW)
7253 {
7254 // Xinef: item is removed, remove loot from storage if any
7256 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7257 continue;
7258 }
7259
7260 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7261 stmt->SetData(0, item->GetGUID().GetCounter());
7262 trans->Append(stmt);
7263
7264 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7265 stmt->SetData(0, item->GetGUID().GetCounter());
7266 trans->Append(stmt);
7268
7269 // Xinef: item is removed, remove loot from storage if any
7271 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7272 }
7273
7274 // Updated played time for refundable items. We don't do this in Player::Update because there's simply no need for it,
7275 // the client auto counts down in real time after having received the initial played time on the first
7276 // SMSG_ITEM_REFUND_INFO_RESPONSE packet.
7277 // Item::UpdatePlayedTime is only called when needed, which is in DB saves, and item refund info requests.
7278 RefundableItemsSet::iterator i_next;
7279 for (RefundableItemsSet::iterator itr = m_refundableItems.begin(); itr != m_refundableItems.end(); itr = i_next)
7280 {
7281 // use copy iterator because itr may be invalid after operations in this loop
7282 i_next = itr;
7283 ++i_next;
7284
7285 Item* iPtr = GetItemByGuid((*itr));
7286 if (iPtr)
7287 {
7288 iPtr->UpdatePlayedTime(this);
7289 continue;
7290 }
7291 else
7292 {
7293 LOG_ERROR("entities.player", "Can't find item {} but is in refundable storage for player {} ! Removing.", (*itr).ToString(), GetGUID().ToString());
7294 m_refundableItems.erase(itr);
7295 }
7296 }
7297
7298 // update enchantment durations
7299 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
7300 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
7301
7302 // if no changes
7303 if (m_itemUpdateQueue.empty())
7304 return;
7305
7307 for (std::size_t i = 0; i < m_itemUpdateQueue.size(); ++i)
7308 {
7309 Item* item = m_itemUpdateQueue[i];
7310 if (!item)
7311 continue;
7312
7313 Bag* container = item->GetContainer();
7314 ObjectGuid::LowType bag_guid = container ? container->GetGUID().GetCounter() : 0;
7315
7316 if (item->GetState() != ITEM_REMOVED)
7317 {
7318 Item* test = GetItemByPos(item->GetBagSlot(), item->GetSlot());
7319 if (!test)
7320 {
7321 ObjectGuid::LowType bagTestGUID = 0;
7322 if (Item* test2 = GetItemByPos(INVENTORY_SLOT_BAG_0, item->GetBagSlot()))
7323 bagTestGUID = test2->GetGUID().GetCounter();
7324 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item {} (state {}) are incorrect, the player doesn't have an item at that position!",
7325 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), (int32)item->GetState());
7326 // according to the test that was just performed nothing should be in this slot, delete
7327 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT);
7328 stmt->SetData(0, bagTestGUID);
7329 stmt->SetData(1, item->GetSlot());
7330 stmt->SetData(2, lowGuid);
7331 trans->Append(stmt);
7332
7333 RemoveTradeableItem(item); // pussywizard
7334 RemoveEnchantmentDurationsReferences(item); // pussywizard
7335 RemoveItemDurations(item); // pussywizard
7336
7337 // also THIS item should be somewhere else, cheat attempt
7338 item->FSetState(ITEM_REMOVED); // we are IN updateQueue right now, can't use SetState which modifies the queue
7340 // don't skip, let the switch delete it
7341 continue;
7342 }
7343 else if (test != item)
7344 {
7345 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item ({}) are incorrect, the item ({}) is there instead!",
7346 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString());
7347 // save all changes to the item...
7348 if (item->GetState() != ITEM_NEW) // only for existing items, no dupes
7349 item->SaveToDB(trans);
7350 // ...but do not save position in invntory
7351 continue;
7352 }
7353 }
7354
7355 switch (item->GetState())
7356 {
7357 case ITEM_NEW:
7358 case ITEM_CHANGED:
7359 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_INVENTORY_ITEM);
7360 stmt->SetData(0, lowGuid);
7361 stmt->SetData(1, bag_guid);
7362 stmt->SetData (2, item->GetSlot());
7363 stmt->SetData(3, item->GetGUID().GetCounter());
7364 trans->Append(stmt);
7365 break;
7366 case ITEM_REMOVED:
7367 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7368 stmt->SetData(0, item->GetGUID().GetCounter());
7369 trans->Append(stmt);
7370 case ITEM_UNCHANGED:
7371 break;
7372 }
7373
7374 item->SaveToDB(trans); // item have unchanged inventory record and can be save standalone
7375 }
7376 m_itemUpdateQueue.clear();
7377}
@ BUYBACK_SLOT_END
Definition: Player.h:731
@ ITEM_CHANGED
Definition: Item.h:210
@ ITEM_NEW
Definition: Item.h:211
@ ITEM_FLAG_HAS_LOOT
Definition: ItemTemplate.h:149
#define sLootItemStorage
Definition: LootItemStorage.h:73
@ CHAR_DEL_ITEM_INSTANCE
Definition: CharacterDatabase.h:127
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
Definition: CharacterDatabase.h:435
@ CHAR_REP_INVENTORY_ITEM
Definition: CharacterDatabase.h:123
@ CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT
Definition: CharacterDatabase.h:436
uint8 GetSlot() const
Definition: Item.h:281
Bag * GetContainer()
Definition: Item.h:282
ItemUpdateState GetState() const
Definition: Item.h:324
void UpdatePlayedTime(Player *owner)
Definition: Item.cpp:1218
uint8 GetBagSlot() const
Definition: Item.cpp:784
bool HasFlag(ItemFlags flag) const
Definition: ItemTemplate.h:827
std::vector< Item * > m_itemUpdateQueue
Definition: Player.h:2803
void DeleteRefundReference(ObjectGuid itemGUID)
Definition: Player.cpp:15454
void RemoveTradeableItem(Item *item)
Definition: PlayerStorage.cpp:4139
EnchantDurationList m_enchantDuration
Definition: Player.h:2846
void RemoveItemDurations(Item *item)
Definition: Player.cpp:12390
void RemoveEnchantmentDurationsReferences(Item *item)
Definition: PlayerStorage.cpp:4214
RefundableItemsSet m_refundableItems
Definition: Player.h:2949
Item * GetItemByGuid(ObjectGuid guid) const
Definition: PlayerStorage.cpp:407

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, CHAR_DEL_CHAR_INVENTORY_BY_ITEM, CHAR_DEL_ITEM_INSTANCE, CHAR_REP_INVENTORY_ITEM, CharacterDatabase, DeleteRefundReference(), Item::FSetState(), Item::GetBagSlot(), Item::GetContainer(), ObjectGuid::GetCounter(), Object::GetGUID(), GetItemByGuid(), GetItemByPos(), WorldObject::GetName(), Item::GetSlot(), Item::GetState(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, ITEM_CHANGED, ITEM_FLAG_HAS_LOOT, ITEM_NEW, ITEM_REMOVED, ITEM_UNCHANGED, LOG_ERROR, m_enchantDuration, m_items, m_itemUpdateQueue, m_refundableItems, RemoveEnchantmentDurationsReferences(), RemoveItemDurations(), RemoveTradeableItem(), Item::SaveToDB(), PreparedStatementBase::SetData(), sLootItemStorage, ObjectGuid::ToString(), Position::ToString(), and Item::UpdatePlayedTime().

Referenced by SaveInventoryAndGoldToDB(), and SaveToDB().

◆ _SaveMail()

void Player::_SaveMail ( CharacterDatabaseTransaction  trans)
protected
7380{
7381 if (!GetMailSize() || !m_mailsUpdated)
7382 {
7383 return;
7384 }
7385
7386 CharacterDatabasePreparedStatement* stmt = nullptr;
7387
7388 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
7389 {
7390 Mail* m = (*itr);
7391 if (m->state == MAIL_STATE_CHANGED)
7392 {
7393 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL);
7394 stmt->SetData(0, uint8(m->HasItems() ? 1 : 0));
7395 stmt->SetData(1, uint32(m->expire_time));
7396 stmt->SetData(2, uint32(m->deliver_time));
7397 stmt->SetData(3, m->money);
7398 stmt->SetData(4, m->COD);
7399 stmt->SetData(5, uint8(m->checked));
7400 stmt->SetData(6, m->messageID);
7401
7402 trans->Append(stmt);
7403
7404 if (!m->removedItems.empty())
7405 {
7406 for (std::vector<uint32>::iterator itr2 = m->removedItems.begin(); itr2 != m->removedItems.end(); ++itr2)
7407 {
7408 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM);
7409 stmt->SetData(0, *itr2);
7410 trans->Append(stmt);
7411 }
7412 m->removedItems.clear();
7413 }
7415 }
7416 else if (m->state == MAIL_STATE_DELETED)
7417 {
7418 if (m->HasItems())
7419 {
7420 for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2)
7421 {
7422 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7423 stmt->SetData(0, itr2->item_guid);
7424 trans->Append(stmt);
7425 }
7426 }
7427 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
7428 stmt->SetData(0, m->messageID);
7429 trans->Append(stmt);
7430
7431 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
7432 stmt->SetData(0, m->messageID);
7433 trans->Append(stmt);
7434 }
7435 }
7436
7437 //deallocate deleted mails...
7438 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end();)
7439 {
7440 if ((*itr)->state == MAIL_STATE_DELETED)
7441 {
7442 Mail* m = *itr;
7443 m_mail.erase(itr);
7444 delete m;
7445 itr = m_mail.begin();
7446 }
7447 else
7448 ++itr;
7449 }
7450
7451 m_mailsUpdated = false;
7452}
@ MAIL_STATE_DELETED
Definition: Mail.h:70
@ MAIL_STATE_CHANGED
Definition: Mail.h:69
@ CHAR_UPD_MAIL
Definition: CharacterDatabase.h:437
@ CHAR_DEL_MAIL_BY_ID
Definition: CharacterDatabase.h:110
@ CHAR_DEL_MAIL_ITEM_BY_ID
Definition: CharacterDatabase.h:382
uint32 GetMailSize()
Definition: Player.h:1658
bool HasItems() const
Definition: Mail.h:206
std::vector< uint32 > removedItems
Definition: Mail.h:177
std::vector< MailItemInfo > items
Definition: Mail.h:176

References CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_UPD_MAIL, CharacterDatabase, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, GetMailSize(), Mail::HasItems(), Mail::items, m_mail, m_mailsUpdated, MAIL_STATE_CHANGED, MAIL_STATE_DELETED, MAIL_STATE_UNCHANGED, Mail::messageID, Mail::money, Mail::removedItems, PreparedStatementBase::SetData(), and Mail::state.

Referenced by WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and SaveToDB().

◆ _SaveMonthlyQuestStatus()

void Player::_SaveMonthlyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7617{
7618 if (!m_MonthlyQuestChanged || m_monthlyquests.empty())
7619 return;
7620
7621 // we don't need transactions here.
7623 stmt->SetData(0, GetGUID().GetCounter());
7624 trans->Append(stmt);
7625
7626 for (QuestSet::const_iterator iter = m_monthlyquests.begin(); iter != m_monthlyquests.end(); ++iter)
7627 {
7628 uint32 quest_id = *iter;
7629 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS);
7630 stmt->SetData(0, GetGUID().GetCounter());
7631 stmt->SetData(1, quest_id);
7632 trans->Append(stmt);
7633 }
7634
7635 m_MonthlyQuestChanged = false;
7636}
@ CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS
Definition: CharacterDatabase.h:76
@ CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR
Definition: CharacterDatabase.h:61

References CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_MonthlyQuestChanged, m_monthlyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SavePlayerSettings()

void Player::_SavePlayerSettings ( CharacterDatabaseTransaction  trans)
protected
92{
93 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
94 {
95 return;
96 }
97
98 for (auto& itr : m_charSettingsMap)
99 {
100 std::ostringstream data;
101
102 for (auto& setting : itr.second)
103 {
104 data << setting.value << ' ';
105 }
106
108 stmt->SetData(0, GetGUID().GetCounter());
109 stmt->SetData(1, itr.first);
110 stmt->SetData(2, data.str());
111 trans->Append(stmt);
112 }
113}
@ CHAR_REP_CHAR_SETTINGS
Definition: CharacterDatabase.h:523

References CHAR_REP_CHAR_SETTINGS, CharacterDatabase, CONFIG_PLAYER_SETTINGS_ENABLED, Object::GetGUID(), m_charSettingsMap, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveQuestStatus()

void Player::_SaveQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7455{
7456 bool isTransaction = static_cast<bool>(trans);
7457 if (!isTransaction)
7458 trans = CharacterDatabase.BeginTransaction();
7459
7460 QuestStatusSaveMap::iterator saveItr;
7461 QuestStatusMap::iterator statusItr;
7462 CharacterDatabasePreparedStatement* stmt = nullptr;
7463
7464 bool keepAbandoned = !(sWorld->GetCleaningFlags() & CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS);
7465
7466 for (saveItr = m_QuestStatusSave.begin(); saveItr != m_QuestStatusSave.end(); ++saveItr)
7467 {
7468 if (saveItr->second)
7469 {
7470 statusItr = m_QuestStatus.find(saveItr->first);
7471 if (statusItr != m_QuestStatus.end() && (keepAbandoned || statusItr->second.Status != QUEST_STATUS_NONE))
7472 {
7473 uint8 index = 0;
7474 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_QUESTSTATUS);
7475
7476 stmt->SetData(index++, GetGUID().GetCounter());
7477 stmt->SetData(index++, statusItr->first);
7478 stmt->SetData(index++, uint8(statusItr->second.Status));
7479 stmt->SetData(index++, statusItr->second.Explored);
7480 stmt->SetData(index++, uint32(statusItr->second.Timer / IN_MILLISECONDS + GameTime::GetGameTime().count()));
7481
7482 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
7483 stmt->SetData(index++, statusItr->second.CreatureOrGOCount[i]);
7484
7485 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
7486 stmt->SetData(index++, statusItr->second.ItemCount[i]);
7487
7488 stmt->SetData(index, statusItr->second.PlayerCount);
7489 trans->Append(stmt);
7490 }
7491 }
7492 else
7493 {
7494 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST);
7495 stmt->SetData(0, GetGUID().GetCounter());
7496 stmt->SetData(1, saveItr->first);
7497 trans->Append(stmt);
7498 }
7499 }
7500
7501 m_QuestStatusSave.clear();
7502
7503 for (saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr)
7504 {
7505 if (saveItr->second)
7506 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_QUESTSTATUS_REWARDED);
7507 else // xinef: what the is this? quest can be removed by spelleffect if (!keepAbandoned)
7509
7510 stmt->SetData(0, GetGUID().GetCounter());
7511 stmt->SetData(1, saveItr->first);
7512 trans->Append(stmt);
7513 }
7514
7515 m_RewardedQuestsSave.clear();
7516
7517 if (!isTransaction)
7518 CharacterDatabase.CommitTransaction(trans);
7519}
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST
Definition: CharacterDatabase.h:441
@ CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST
Definition: CharacterDatabase.h:439
@ CHAR_REP_CHAR_QUESTSTATUS
Definition: CharacterDatabase.h:438
@ CHAR_INS_CHAR_QUESTSTATUS_REWARDED
Definition: CharacterDatabase.h:440
@ CLEANING_FLAG_QUESTSTATUS
Definition: CharacterDatabaseCleaner.h:31
QuestStatusSaveMap m_QuestStatusSave
Definition: Player.h:2809
QuestStatusSaveMap m_RewardedQuestsSave
Definition: Player.h:2812

References CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, CHAR_INS_CHAR_QUESTSTATUS_REWARDED, CHAR_REP_CHAR_QUESTSTATUS, CharacterDatabase, CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS, ObjectGuid::GetCounter(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, m_QuestStatus, m_QuestStatusSave, m_RewardedQuestsSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_NONE, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveSeasonalQuestStatus()

void Player::_SaveSeasonalQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7583{
7585 {
7586 return;
7587 }
7588
7589 // we don't need transactions here.
7591 stmt->SetData(0, GetGUID().GetCounter());
7592 trans->Append(stmt);
7593
7594 m_SeasonalQuestChanged = false;
7595
7596 if (m_seasonalquests.empty())
7597 {
7598 return;
7599 }
7600
7601 for (SeasonalEventQuestMap::const_iterator iter = m_seasonalquests.begin(); iter != m_seasonalquests.end(); ++iter)
7602 {
7603 uint16 eventId = iter->first;
7604
7605 for (SeasonalQuestSet::const_iterator itr = iter->second.begin(); itr != iter->second.end(); ++itr)
7606 {
7607 uint32 questId = *itr;
7608
7609 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
7610 stmt->SetArguments(GetGUID().GetCounter(), questId, eventId);
7611 trans->Append(stmt);
7612 }
7613 }
7614}
@ CHAR_INS_CHARACTER_SEASONALQUESTSTATUS
Definition: CharacterDatabase.h:77
@ CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR
Definition: CharacterDatabase.h:62
void SetArguments(Args &&... args)
Definition: PreparedStatement.h:118

References CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_SeasonalQuestChanged, m_seasonalquests, PreparedStatementBase::SetArguments(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSkills()

void Player::_SaveSkills ( CharacterDatabaseTransaction  trans)
7639{
7640 CharacterDatabasePreparedStatement* stmt = nullptr;
7641 // we don't need transactions here.
7642 for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end();)
7643 {
7644 if (itr->second.uState == SKILL_UNCHANGED)
7645 {
7646 ++itr;
7647 continue;
7648 }
7649
7650 if (itr->second.uState == SKILL_DELETED)
7651 {
7652 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL);
7653 stmt->SetData(0, GetGUID().GetCounter());
7654 stmt->SetData(1, itr->first);
7655 trans->Append(stmt);
7656
7657 mSkillStatus.erase(itr++);
7658 continue;
7659 }
7660
7661 uint32 valueData = GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos));
7662 uint16 value = SKILL_VALUE(valueData);
7663 uint16 max = SKILL_MAX(valueData);
7664
7665 switch (itr->second.uState)
7666 {
7667 case SKILL_NEW:
7668 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILLS);
7669 stmt->SetData(0, GetGUID().GetCounter());
7670 stmt->SetData(1, uint16(itr->first));
7671 stmt->SetData(2, value);
7672 stmt->SetData(3, max);
7673 trans->Append(stmt);
7674
7675 break;
7676 case SKILL_CHANGED:
7677 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_SKILLS);
7678 stmt->SetData(0, value);
7679 stmt->SetData(1, max);
7680 stmt->SetData(2, GetGUID().GetCounter());
7681 stmt->SetData(3, uint16(itr->first));
7682 trans->Append(stmt);
7683
7684 break;
7685 default:
7686 break;
7687 }
7688 itr->second.uState = SKILL_UNCHANGED;
7689
7690 ++itr;
7691 }
7692}
#define SKILL_MAX(x)
Definition: Player.h:83
#define SKILL_VALUE(x)
Definition: Player.h:82
@ SKILL_DELETED
Definition: Player.h:648
@ SKILL_CHANGED
Definition: Player.h:646
@ SKILL_NEW
Definition: Player.h:647
@ CHAR_INS_CHAR_SKILLS
Definition: CharacterDatabase.h:446
@ CHAR_UDP_CHAR_SKILLS
Definition: CharacterDatabase.h:447
@ CHAR_DEL_CHAR_SKILL_BY_SKILL
Definition: CharacterDatabase.h:445

References CHAR_DEL_CHAR_SKILL_BY_SKILL, CHAR_INS_CHAR_SKILLS, CHAR_UDP_CHAR_SKILLS, CharacterDatabase, Object::GetGUID(), Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_UNCHANGED, and SKILL_VALUE.

Referenced by SaveToDB().

◆ _SaveSpellCooldowns()

void Player::_SaveSpellCooldowns ( CharacterDatabaseTransaction  trans,
bool  logout 
)
3624{
3626 stmt->SetData(0, GetGUID().GetCounter());
3627 trans->Append(stmt);
3628
3629 time_t curTime = GameTime::GetGameTime().count();
3630 uint32 curMSTime = GameTime::GetGameTimeMS().count();
3631 uint32 infTime = curMSTime + infinityCooldownDelayCheck;
3632
3633 bool first_round = true;
3634 std::ostringstream ss;
3635
3636 // remove outdated and save active
3637 for (SpellCooldowns::iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end();)
3638 {
3639 // Xinef: dummy cooldown for procs
3640 if (itr->first == uint32(-1))
3641 {
3642 ++itr;
3643 continue;
3644 }
3645
3646 if (itr->second.end <= curMSTime + 1000)
3647 m_spellCooldowns.erase(itr++);
3648 else if (itr->second.end <= infTime && (logout || itr->second.end > (curMSTime + 5 * MINUTE * IN_MILLISECONDS))) // not save locked cooldowns, it will be reset or set at reload
3649 {
3650 if (first_round)
3651 {
3652 ss << "INSERT INTO character_spell_cooldown (guid, spell, category, item, time, needSend) VALUES ";
3653 first_round = false;
3654 }
3655 // next new/changed record prefix
3656 else
3657 ss << ',';
3658
3659 uint64 cooldown = uint64(((itr->second.end - curMSTime) / IN_MILLISECONDS) + curTime);
3660 ss << '(' << GetGUID().GetCounter() << ',' << itr->first << ',' << itr->second.category << "," << itr->second.itemid << ',' << cooldown << ',' << (itr->second.needSendToClient ? '1' : '0') << ')';
3661 ++itr;
3662 }
3663 else
3664 ++itr;
3665 }
3666 // if something changed execute
3667 if (!first_round)
3668 trans->Append(ss.str().c_str());
3669}
static constexpr uint32 infinityCooldownDelayCheck
Definition: Unit.h:48
@ CHAR_DEL_CHAR_SPELL_COOLDOWN
Definition: CharacterDatabase.h:406

References CHAR_DEL_CHAR_SPELL_COOLDOWN, CharacterDatabase, ObjectGuid::GetCounter(), GameTime::GetGameTime(), GameTime::GetGameTimeMS(), Object::GetGUID(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSpells()

void Player::_SaveSpells ( CharacterDatabaseTransaction  trans)
protected
7695{
7696 CharacterDatabasePreparedStatement* stmt = nullptr;
7697
7698 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();)
7699 {
7700 // xinef: skip temporary spells
7701 if (itr->second->State == PLAYERSPELL_TEMPORARY)
7702 {
7703 ++itr;
7704 continue;
7705 }
7706
7707 // xinef: Delete statement for removed / updated spell
7708 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
7709 {
7710 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL);
7711 stmt->SetData(0, GetGUID().GetCounter());
7712 stmt->SetData(1, itr->first);
7713 trans->Append(stmt);
7714 }
7715
7716 // xinef: insert statement for new / updated spell
7717 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
7718 {
7719 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SPELL);
7720 stmt->SetData(0, GetGUID().GetCounter());
7721 stmt->SetData(1, itr->first);
7722 stmt->SetData(2, itr->second->specMask);
7723 trans->Append(stmt);
7724 }
7725
7726 if (itr->second->State == PLAYERSPELL_REMOVED)
7727 {
7728 delete itr->second;
7729 m_spells.erase(itr++);
7730 }
7731 else
7732 {
7733 itr->second->State = PLAYERSPELL_UNCHANGED;
7734 ++itr;
7735 }
7736 }
7737}
@ CHAR_INS_CHAR_SPELL
Definition: CharacterDatabase.h:448
@ CHAR_DEL_CHAR_SPELL_BY_SPELL
Definition: CharacterDatabase.h:399

References CHAR_DEL_CHAR_SPELL_BY_SPELL, CHAR_INS_CHAR_SPELL, CharacterDatabase, Object::GetGUID(), m_spells, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveStats()

void Player::_SaveStats ( CharacterDatabaseTransaction  trans)
protected
7742{
7743 // check if stat saving is enabled and if char level is high enough
7744 if (!sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || GetLevel() < sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE))
7745 return;
7746
7747 CharacterDatabasePreparedStatement* stmt = nullptr;
7748
7749 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS);
7750 stmt->SetData(0, GetGUID().GetCounter());
7751 trans->Append(stmt);
7752
7753 uint8 index = 0;
7754
7755 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_STATS);
7756 stmt->SetData(index++, GetGUID().GetCounter());
7757 stmt->SetData(index++, GetMaxHealth());
7758
7759 for (uint8 i = 0; i < MAX_POWERS; ++i)
7760 stmt->SetData(index++, GetMaxPower(Powers(i)));
7761
7762 for (uint8 i = 0; i < MAX_STATS; ++i)
7763 stmt->SetData(index++, GetStat(Stats(i)));
7764
7765 for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
7766 stmt->SetData(index++, GetResistance(SpellSchools(i)));
7767
7776 stmt->SetData(index++, GetBaseSpellPowerBonus());
7778
7779 trans->Append(stmt);
7780}
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition: UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition: UpdateFields.h:351
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition: UpdateFields.h:354
@ PLAYER_FIELD_COMBAT_RATING_1
Definition: UpdateFields.h:380
@ PLAYER_PARRY_PERCENTAGE
Definition: UpdateFields.h:348
@ PLAYER_BLOCK_PERCENTAGE
Definition: UpdateFields.h:346
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition: UpdateFields.h:165
@ PLAYER_DODGE_PERCENTAGE
Definition: UpdateFields.h:347
@ UNIT_FIELD_ATTACK_POWER
Definition: UpdateFields.h:162
@ CONFIG_MIN_LEVEL_STAT_SAVE
Definition: IWorld.h:353
@ CHAR_DEL_CHAR_STATS
Definition: CharacterDatabase.h:449
@ CHAR_INS_CHAR_STATS
Definition: CharacterDatabase.h:450
#define MAX_STATS
Definition: SharedDefines.h:265
SpellSchools
Definition: SharedDefines.h:282
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:292
Stats
Definition: SharedDefines.h:257
float GetFloatValue(uint16 index) const
Definition: Object.cpp:317
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1979
uint32 GetResistance(SpellSchoolMask mask) const
Definition: Unit.cpp:20099
uint32 GetMaxHealth() const
Definition: Unit.h:1030
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:1057
float GetStat(Stats stat) const
Definition: Unit.h:995

References CHAR_DEL_CHAR_STATS, CHAR_INS_CHAR_STATS, CharacterDatabase, CONFIG_MIN_LEVEL_STAT_SAVE, CR_CRIT_TAKEN_SPELL, GetBaseSpellPowerBonus(), Object::GetFloatValue(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), Object::GetUInt32Value(), MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, PreparedStatementBase::SetData(), sWorld, UNIT_FIELD_ATTACK_POWER, and UNIT_FIELD_RANGED_ATTACK_POWER.

Referenced by SaveToDB().

◆ _SaveTalents()

void Player::_SaveTalents ( CharacterDatabaseTransaction  trans)
protected
14967{
14968 CharacterDatabasePreparedStatement* stmt = nullptr;
14969
14970 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end();)
14971 {
14972 // xinef: skip temporary spells
14973 if (itr->second->State == PLAYERSPELL_TEMPORARY)
14974 {
14975 ++itr;
14976 continue;
14977 }
14978
14979 // xinef: delete statement for removed / updated talent
14980 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
14981 {
14982 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL);
14983 stmt->SetData(0, GetGUID().GetCounter());
14984 stmt->SetData(1, itr->first);
14985 trans->Append(stmt);
14986 }
14987
14988 // xinef: insert statement for new / updated spell
14989 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
14990 {
14991 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT);
14992 stmt->SetData(0, GetGUID().GetCounter());
14993 stmt->SetData(1, itr->first);
14994 stmt->SetData(2, itr->second->specMask);
14995 trans->Append(stmt);
14996 }
14997
14998 if (itr->second->State == PLAYERSPELL_REMOVED)
14999 {
15000 delete itr->second;
15001 m_talents.erase(itr++);
15002 }
15003 else
15004 {
15005 itr->second->State = PLAYERSPELL_UNCHANGED;
15006 ++itr;
15007 }
15008 }
15009}
@ CHAR_INS_CHAR_TALENT
Definition: CharacterDatabase.h:458
@ CHAR_DEL_CHAR_TALENT_BY_SPELL
Definition: CharacterDatabase.h:457

References CHAR_DEL_CHAR_TALENT_BY_SPELL, CHAR_INS_CHAR_TALENT, CharacterDatabase, Object::GetGUID(), m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveWeeklyQuestStatus()

void Player::_SaveWeeklyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7560{
7561 if (!m_WeeklyQuestChanged || m_weeklyquests.empty())
7562 return;
7563
7564 // we don't need transactions here.
7566 stmt->SetData(0, GetGUID().GetCounter());
7567 trans->Append(stmt);
7568
7569 for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
7570 {
7571 uint32 quest_id = *iter;
7572
7573 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
7574 stmt->SetData(0, GetGUID().GetCounter());
7575 stmt->SetData(1, quest_id);
7576 trans->Append(stmt);
7577 }
7578
7579 m_WeeklyQuestChanged = false;
7580}
@ CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR
Definition: CharacterDatabase.h:60
@ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS
Definition: CharacterDatabase.h:75

References CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_WeeklyQuestChanged, m_weeklyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _StoreItem()

Item * Player::_StoreItem ( uint16  pos,
Item pItem,
uint32  count,
bool  clone,
bool  update 
)
private
2610{
2611 if (!pItem)
2612 return nullptr;
2613
2614 uint8 bag = pos >> 8;
2615 uint8 slot = pos & 255;
2616
2617 LOG_DEBUG("entities.player.items", "STORAGE: StoreItem bag = {}, slot = {}, item = {}, count = {}, {}", bag, slot, pItem->GetEntry(), count, pItem->GetGUID().ToString());
2618
2619 Item* pItem2 = GetItemByPos(bag, slot);
2620
2621 if (!pItem2)
2622 {
2623 if (clone)
2624 pItem = pItem->CloneItem(count, this);
2625 else
2626 pItem->SetCount(count);
2627
2628 if (!pItem)
2629 return nullptr;
2630
2631 if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2632 pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2633 (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2634 pItem->SetBinding(true);
2635
2636 Bag* pBag = (bag == INVENTORY_SLOT_BAG_0) ? nullptr : GetBagByPos(bag);
2637 if (!pBag)
2638 {
2639 m_items[slot] = pItem;
2640 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2643
2644 pItem->SetSlot(slot);
2645 pItem->SetContainer(nullptr);
2646
2647 // need update known currency
2649 AddKnownCurrency(pItem->GetEntry());
2650 }
2651 else
2652 pBag->StoreItem(slot, pItem, update);
2653
2654 if (IsInWorld() && update)
2655 {
2656 pItem->AddToWorld();
2657 pItem->SendUpdateToPlayer(this);
2658 }
2659
2660 pItem->SetState(ITEM_CHANGED, this);
2661 if (pBag)
2662 pBag->SetState(ITEM_CHANGED, this);
2663
2665 AddItemDurations(pItem);
2666
2667 return pItem;
2668 }
2669 else
2670 {
2671 if (pItem2->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2672 pItem2->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2673 (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2674 pItem2->SetBinding(true);
2675
2676 pItem2->SetCount(pItem2->GetCount() + count);
2677 if (IsInWorld() && update)
2678 pItem2->SendUpdateToPlayer(this);
2679
2680 if (!clone)
2681 {
2682 // delete item (it not in any slot currently)
2683 if (IsInWorld() && update)
2684 {
2685 pItem->RemoveFromWorld();
2686 pItem->DestroyForPlayer(this);
2687 }
2688
2690 RemoveItemDurations(pItem);
2691
2692 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2693 pItem->SetNotRefundable(this);
2694 pItem->ClearSoulboundTradeable(this);
2695 RemoveTradeableItem(pItem);
2696 pItem->SetState(ITEM_REMOVED, this);
2697 }
2698
2700
2701 pItem2->SetState(ITEM_CHANGED, this);
2702
2703 return pItem2;
2704 }
2705}
@ PLAYER_FIELD_INV_SLOT_HEAD
Definition: UpdateFields.h:327
@ ITEM_FIELD_OWNER
Definition: UpdateFields.h:35
@ ITEM_FIELD_CONTAINED
Definition: UpdateFields.h:36
@ CURRENCYTOKEN_SLOT_END
Definition: Player.h:743
@ CURRENCYTOKEN_SLOT_START
Definition: Player.h:742
@ BIND_WHEN_EQUIPPED
Definition: ItemTemplate.h:97
@ BIND_QUEST_ITEM
Definition: ItemTemplate.h:99
@ BIND_WHEN_PICKED_UP
Definition: ItemTemplate.h:96
void StoreItem(uint8 slot, Item *pItem, bool update)
Definition: Bag.cpp:154
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
Definition: Item.cpp:714
void SetBinding(bool val)
Definition: Item.h:235
Item * CloneItem(uint32 count, Player const *player=nullptr) const
Definition: Item.cpp:1118
void SetCount(uint32 value)
Definition: Item.h:273
void SetNotRefundable(Player *owner, bool changestate=true, CharacterDatabaseTransaction *trans=nullptr)
Definition: Item.cpp:1200
void SetSlot(uint8 slot)
Definition: Item.h:284
uint32 GetCount() const
Definition: Item.h:272
void SetOwnerGUID(ObjectGuid guid)
Definition: Item.h:232
void SetContainer(Bag *container)
Definition: Item.h:286
uint32 Bonding
Definition: ItemTemplate.h:663
virtual void DestroyForPlayer(Player *target, bool onDeath=false) const
Definition: Object.cpp:274
void SetGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:723
virtual void AddToWorld()
Definition: Object.cpp:152
virtual void RemoveFromWorld()
Definition: Object.cpp:166
void SendUpdateToPlayer(Player *player)
Definition: Object.cpp:246
Bag * GetBagByPos(uint8 slot) const
Definition: PlayerStorage.cpp:457
void AddEnchantmentDurations(Item *item)
Definition: PlayerStorage.cpp:4186
void RemoveEnchantmentDurations(Item *item)
Definition: PlayerStorage.cpp:4199
void AddItemDurations(Item *item)
Definition: Player.cpp:12402
void AddKnownCurrency(uint32 itemId)
Definition: Player.cpp:14154

References AddEnchantmentDurations(), AddItemDurations(), AddKnownCurrency(), Object::AddToWorld(), BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, Item::ClearSoulboundTradeable(), Item::CloneItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, Object::DestroyForPlayer(), GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, IsBagPos(), Object::IsInWorld(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, ITEM_REMOVED, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Item::SetBinding(), Item::SetContainer(), Item::SetCount(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetSlot(), Item::SetState(), Bag::StoreItem(), and ObjectGuid::ToString().

Referenced by StoreItem().

◆ _StoreOrEquipNewItem()

bool Player::_StoreOrEquipNewItem ( uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot,
int32  price,
ItemTemplate const *  pProto,
Creature pVendor,
VendorItem const *  crItem,
bool  bStore 
)
inline
10594{
10595 ItemPosCountVec vDest;
10596 uint16 uiDest = 0;
10597 InventoryResult msg = bStore ?
10598 CanStoreNewItem(bag, slot, vDest, item, pProto->BuyCount * count) :
10599 CanEquipNewItem(slot, uiDest, item, false);
10600 if (msg != EQUIP_ERR_OK)
10601 {
10602 SendEquipError(msg, nullptr, nullptr, item);
10603 return false;
10604 }
10605
10606 ModifyMoney(-price);
10607
10608 if (crItem->ExtendedCost) // case for new honor system
10609 {
10610 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10611 if (iece->reqhonorpoints)
10612 ModifyHonorPoints(- int32(iece->reqhonorpoints * count));
10613
10614 if (iece->reqarenapoints)
10615 ModifyArenaPoints(- int32(iece->reqarenapoints * count));
10616
10617 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10618 {
10619 if (iece->reqitem[i])
10620 DestroyItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count), true);
10621 }
10622 }
10623
10624 sScriptMgr->OnPlayerBeforeStoreOrEquipNewItem(this, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore);
10625
10626 Item* it = bStore ? StoreNewItem(vDest, item, true) : EquipNewItem(uiDest, item, true);
10627 if (it)
10628 {
10629 uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, pProto->BuyCount * count);
10630
10631 WorldPacket data(SMSG_BUY_ITEM, (8 + 4 + 4 + 4));
10632 data << pVendor->GetGUID();
10633 data << uint32(vendorslot + 1); // numbered from 1 at client
10634 data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
10635 data << uint32(count);
10636 GetSession()->SendPacket(&data);
10637 SendNewItem(it, pProto->BuyCount * count, true, false, false);
10638
10639 if (!bStore)
10641
10642 if (pProto->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1)
10643 {
10645 it->SetRefundRecipient(GetGUID().GetCounter());
10646 it->SetPaidMoney(price);
10647 it->SetPaidExtendedCost(crItem->ExtendedCost);
10648 it->SaveRefundDataToDB();
10650 }
10651 }
10652
10653 sScriptMgr->OnPlayerAfterStoreOrEquipNewItem(this, vendorslot, it, count, bag, slot, pProto, pVendor, crItem, bStore);
10654
10655 return true;
10656}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
InventoryResult
Definition: Item.h:46
@ ITEM_FLAG_ITEM_PURCHASE_RECORD
Definition: ItemTemplate.h:159
#define MAX_ITEM_EXTENDED_COST_REQUIREMENTS
Definition: DBCStructure.h:1183
@ SMSG_BUY_ITEM
Definition: Opcodes.h:450
uint32 UpdateVendorItemCurrentCount(VendorItem const *vItem, uint32 used_count)
Definition: Creature.cpp:3110
void SaveRefundDataToDB()
Definition: Item.cpp:1172
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:845
InventoryResult CanEquipNewItem(uint8 slot, uint16 &dest, uint32 item, bool swap) const
Definition: PlayerStorage.cpp:1791
bool ModifyMoney(int32 amount, bool sendError=true)
Definition: Player.cpp:11463
Item * EquipNewItem(uint16 pos, uint32 item, bool update)
Definition: PlayerStorage.cpp:2707
void SendNewItem(Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
Definition: PlayerStorage.cpp:4750
void AutoUnequipOffhandIfNeed(bool force=false)
Definition: Player.cpp:12411
void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition: PlayerStorage.cpp:3121
void ModifyHonorPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
Definition: Player.cpp:6292
void ModifyArenaPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
If trans is specified, honor save query will be added to trans.
Definition: Player.cpp:6308
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
Definition: PlayerStorage.cpp:2524
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
Definition: PlayerStorage.cpp:4021
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition: Player.h:1292
Definition: WorldPacket.h:26
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:226
Definition: DBCStructure.h:1186
uint32 reqarenapoints
Definition: DBCStructure.h:1189
uint32 reqitemcount[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition: DBCStructure.h:1192
uint32 reqitem[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition: DBCStructure.h:1191
uint32 reqhonorpoints
Definition: DBCStructure.h:1188

References AddRefundReference(), AutoUnequipOffhandIfNeed(), ItemTemplate::BuyCount, CanEquipNewItem(), CanStoreNewItem(), DestroyItemCount(), EQUIP_ERR_OK, EquipNewItem(), VendorItem::ExtendedCost, Object::GetGUID(), ItemTemplate::GetMaxStackSize(), GetSession(), ItemTemplate::HasFlag(), ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_ITEM_PURCHASE_RECORD, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, VendorItem::maxcount, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, Item::SaveRefundDataToDB(), SendEquipError(), SendNewItem(), WorldSession::SendPacket(), Object::SetFlag(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), sItemExtendedCostStore, SMSG_BUY_ITEM, sScriptMgr, StoreNewItem(), and Creature::UpdateVendorItemCurrentCount().

Referenced by BuyItemFromVendorSlot().

◆ AbandonQuest()

void Player::AbandonQuest ( uint32  quest_id)
931{
932 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
933 {
934 // It will Destroy quest items on quests abandons.
935 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
936 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
937 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
938 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
939
940 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
941 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
942 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
943 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
944 }
945}
#define QUEST_SOURCE_ITEM_IDS_COUNT
Definition: QuestDef.h:37

References BIND_QUEST_ITEM, DestroyItemCount(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, and sObjectMgr.

Referenced by WorldSession::HandleQuestLogRemoveQuest().

◆ ActivateSpec()

void Player::ActivateSpec ( uint8  spec)
15012{
15013 // xinef: some basic checks
15014 if (GetActiveSpec() == spec)
15015 return;
15016
15017 if (spec > GetSpecsCount())
15018 return;
15019
15020 // xinef: interrupt currently casted spell just in case
15021 if (IsNonMeleeSpellCast(false))
15023
15024 // xinef: save current actions order
15025 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15026 _SaveActions(trans);
15027 CharacterDatabase.CommitTransaction(trans);
15028
15029 // xinef: remove pet, it will be resummoned later
15030 if (Pet* pet = GetPet())
15032
15033 // xinef: remove other summoned units and clear reactives
15037
15038 // xinef: let client clear his current Actions
15040 uint8 oldSpec = GetActiveSpec();
15041
15042 std::unordered_set<uint32> removedSpecAuras;
15043
15044 // xinef: reset talent auras
15045 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15046 {
15047 if (itr->second->State == PLAYERSPELL_REMOVED)
15048 continue;
15049
15050 // xinef: remove all active talent auras
15051 if (!(itr->second->specMask & GetActiveSpecMask()))
15052 continue;
15053
15054 _removeTalentAurasAndSpells(itr->first);
15055
15056 // pussywizard: was => isn't
15057 if (!itr->second->IsInSpec(spec) && !itr->second->inSpellBook)
15058 SendLearnPacket(itr->first, false);
15059
15060 removedSpecAuras.insert(itr->first);
15061 }
15062
15063 // xinef: remove glyph auras
15064 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15065 if (uint32 glyphId = m_Glyphs[GetActiveSpec()][slot])
15066 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15067 {
15068 RemoveAurasDueToSpell(glyphEntry->SpellId);
15069 removedSpecAuras.insert(glyphEntry->SpellId);
15070 }
15071
15072 // xinef: set active spec as new one
15073 SetActiveSpec(spec);
15074 uint32 spentTalents = 0;
15075
15076 // xinef: add talent auras
15077 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15078 {
15079 if (itr->second->State == PLAYERSPELL_REMOVED)
15080 continue;
15081
15082 // xinef: talent not in new spec
15083 if (!(itr->second->specMask & GetActiveSpecMask()))
15084 continue;
15085
15086 // pussywizard: wasn't => is
15087 if (!itr->second->IsInSpec(oldSpec) && !itr->second->inSpellBook)
15088 SendLearnPacket(itr->first, true);
15089
15090 _addTalentAurasAndSpells(itr->first);
15091 TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first);
15092 spentTalents += talentPos->rank + 1;
15093
15094 removedSpecAuras.erase(itr->first);
15095 }
15096
15097 // pussywizard: remove spells that are in previous spec, but are not present in new one (or are in new spec, but not in the old one)
15098 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15099 {
15100 if (!itr->second->Active || itr->second->State == PLAYERSPELL_REMOVED)
15101 continue;
15102
15103 // pussywizard: was => isn't
15104 if (itr->second->IsInSpec(oldSpec) && !itr->second->IsInSpec(spec))
15105 {
15106 SendLearnPacket(itr->first, false);
15107 // We want to remove all auras of the unlearned spell
15108 _removeTalentAurasAndSpells(itr->first);
15109
15110 removedSpecAuras.insert(itr->first);
15111 }
15112 // pussywizard: wasn't => is
15113 else if (!itr->second->IsInSpec(oldSpec) && itr->second->IsInSpec(spec))
15114 {
15115 SendLearnPacket(itr->first, true);
15116
15117 removedSpecAuras.erase(itr->first);
15118 }
15119 }
15120
15121 // xinef: apply glyphs from second spec
15122 if (GetActiveSpec() != oldSpec)
15123 {
15124 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15125 {
15126 uint32 glyphId = m_Glyphs[GetActiveSpec()][slot];
15127 if (glyphId)
15128 {
15129 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15130 {
15132 removedSpecAuras.erase(glyphEntry->SpellId);
15133 }
15134 }
15135
15136 SetGlyph(slot, glyphId, true);
15137 }
15138 }
15139
15140 // Remove auras triggered/activated by talents/glyphs
15141 // Mostly explicit casts in dummy aura scripts
15142 if (!removedSpecAuras.empty())
15143 {
15144 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
15145 {
15146 Aura* aura = iter->second;
15147 if (SpellInfo const* triggeredByAuraSpellInfo = aura->GetTriggeredByAuraSpellInfo())
15148 {
15149 if (removedSpecAuras.find(triggeredByAuraSpellInfo->Id) != removedSpecAuras.end())
15150 {
15151 RemoveOwnedAura(iter);
15152 continue;
15153 }
15154 }
15155 ++iter;
15156 }
15157 }
15158
15159 m_usedTalentCount = spentTalents;
15161
15162 // load them asynchronously
15163 {
15165 stmt->SetData(0, GetGUID().GetCounter());
15166 stmt->SetData(1, m_activeSpec);
15167
15168 WorldSession* mySess = GetSession();
15169 mySess->GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(stmt)
15170 .WithPreparedCallback([mySess](PreparedQueryResult result)
15171 {
15172 // safe callback, we can't pass this pointer directly
15173 // in case player logs out before db response (player would be deleted in that case)
15174 if (Player* thisPlayer = mySess->GetPlayer())
15175 thisPlayer->LoadActions(result);
15176 }));
15177 }
15178
15179 // xinef: reset power
15180 Powers pw = getPowerType();
15181 if (pw != POWER_MANA)
15182 SetPower(POWER_MANA, 0); // Mana must be 0 even if it isn't the active power type.
15183 SetPower(pw, 0);
15184
15185 // xinef: remove titan grip if player had it set and does not have appropriate talent
15186 if (!HasTalent(46917, GetActiveSpec()) && m_canTitanGrip)
15187 SetCanTitanGrip(false);
15188 // xinef: remove dual wield if player does not have dual wield spell (shamans)
15189 if (!HasSpell(674) && m_canDualWield)
15190 SetCanDualWield(false);
15191
15193
15194 // Xinef: Patch 3.2.0: Switching spec removes paladins spell Righteous Fury (25780)
15196 RemoveAurasDueToSpell(25780);
15197
15198 // Xinef: Remove talented single target auras at other targets
15199 AuraList& scAuras = GetSingleCastAuras();
15200 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
15201 {
15202 Aura* aura = *iter;
15203 if (!HasActiveSpell(aura->GetId()) && !HasTalent(aura->GetId(), GetActiveSpec()) && !aura->GetCastItemGUID())
15204 {
15205 aura->Remove();
15206 iter = scAuras.begin();
15207 }
15208 else
15209 ++iter;
15210 }
15211
15212 sScriptMgr->OnPlayerAfterSpecSlotChanged(this, GetActiveSpec());
15213}
@ CLASS_CONTEXT_ABILITY
Definition: UnitDefines.h:234
@ CHAR_SEL_CHARACTER_ACTIONS_SPEC
Definition: CharacterDatabase.h:81
@ POWER_MANA
Definition: SharedDefines.h:269
@ CLASS_PALADIN
Definition: SharedDefines.h:142
T & AddCallback(T &&query)
Definition: AsyncCallbackProcessor.h:34
Definition: Pet.h:41
void InitTalentForLevel()
Definition: Player.cpp:2567
void SetCanTitanGrip(bool value)
Definition: Player.cpp:13088
void SetActiveSpec(uint8 spec)
Definition: Player.h:1751
Pet * GetPet() const
Definition: Player.cpp:8919
bool HasTalent(uint32 spell_id, uint8 spec) const
Definition: Player.cpp:3885
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Definition: Player.cpp:9069
void _SaveActions(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7135
uint8 GetActiveSpecMask() const
Definition: Player.h:1750
uint8 GetSpecsCount() const
Definition: Player.h:1752
bool HasSpell(uint32 spell) const override
Definition: Player.cpp:3879
void SendActionButtons(uint32 state) const
Definition: Player.cpp:5559
void _addTalentAurasAndSpells(uint32 spellId)
Definition: Player.cpp:3022
virtual void SetCanDualWield(bool value)
Definition: Unit.h:917
std::list< Aura * > AuraList
Definition: Unit.h:637
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4162
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15617
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4132
void ClearAllReactives()
Definition: Unit.cpp:16960
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11249
bool m_canDualWield
Definition: Unit.h:1978
Powers getPowerType() const
Definition: Unit.h:1052
AuraList & GetSingleCastAuras()
Definition: Unit.h:1350
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11130
Player session in the World.
Definition: WorldSession.h:330
QueryCallbackProcessor & GetQueryProcessor()
Definition: WorldSession.h:1087
uint32 GetId() const
Definition: SpellAuras.cpp:466
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103
SpellInfo const * GetTriggeredByAuraSpellInfo() const
Definition: SpellAuras.cpp:2761
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
uint8 rank
Definition: DBCStructure.h:2238

References _addTalentAurasAndSpells(), _removeTalentAurasAndSpells(), _SaveActions(), AsyncCallbackProcessor< T >::AddCallback(), AutoUnequipOffhandIfNeed(), Unit::CastSpell(), CHAR_SEL_CHARACTER_ACTIONS_SPEC, CharacterDatabase, CLASS_CONTEXT_ABILITY, CLASS_PALADIN, Unit::ClearAllReactives(), GetActiveSpec(), GetActiveSpecMask(), Aura::GetCastItemGUID(), Object::GetGUID(), Aura::GetId(), GetPet(), Unit::getPowerType(), WorldSession::GetQueryProcessor(), GetSession(), Unit::GetSingleCastAuras(), GetSpecsCount(), GetTalentSpellPos(), Aura::GetTriggeredByAuraSpellInfo(), HasActiveSpell(), HasSpell(), HasTalent(), InitTalentForLevel(), Unit::InterruptNonMeleeSpells(), IsClass(), Unit::IsNonMeleeSpellCast(), m_activeSpec, Unit::m_canDualWield, m_canTitanGrip, m_Glyphs, Unit::m_ownedAuras, m_spells, m_talents, m_usedTalentCount, MAX_GLYPH_SLOT_INDEX, PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, POWER_MANA, TalentSpellPos::rank, Aura::Remove(), Unit::RemoveAllControlled(), Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), RemovePet(), SendActionButtons(), SendLearnPacket(), SetActiveSpec(), Unit::SetCanDualWield(), SetCanTitanGrip(), PreparedStatementBase::SetData(), SetGlyph(), Unit::SetPower(), sGlyphPropertiesStore, sScriptMgr, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, TRIGGERED_IGNORE_SHAPESHIFT, and Unit::UnsummonAllTotems().

Referenced by UpdateSpecCount().

◆ ActivateTaxiPathTo() [1/2]

bool Player::ActivateTaxiPathTo ( std::vector< uint32 > const &  nodes,
Creature npc = nullptr,
uint32  spellid = 1 
)
10182{
10183 if (nodes.size() < 2)
10184 return false;
10185
10186 // not let cheating with start flight in time of logout process || while in combat || has type state: stunned || has type state: root
10188 {
10190 return false;
10191 }
10192
10194 return false;
10195
10196 // taximaster case
10197 if (npc)
10198 {
10199 // not let cheating with start flight mounted
10200 if (IsMounted())
10201 {
10203 return false;
10204 }
10205
10207 {
10209 return false;
10210 }
10211
10212 // not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi
10213 if (IsNonMeleeSpellCast(false))
10214 {
10216 return false;
10217 }
10218 }
10219 // cast case or scripted call case
10220 else
10221 {
10223
10226
10228 if (spell->m_spellInfo->Id != spellid)
10230
10232
10234 if (spell->m_spellInfo->Id != spellid)
10236 }
10237
10238 uint32 sourcenode = nodes[0];
10239
10240 // starting node too far away (cheat?)
10241 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(sourcenode);
10242 if (!node)
10243 {
10245 return false;
10246 }
10247
10248 // Prepare to flight start now
10249
10250 // stop combat at start taxi flight if any
10251 CombatStop();
10252
10255 ExitVehicle();
10256
10257 // stop trade (client cancel trade at taxi map open but cheating tools can be used for reopen it)
10258 TradeCancel(true);
10259
10260 // clean not finished taxi path if any
10262
10263 // 0 element current node
10264 m_taxi.AddTaxiDestination(sourcenode);
10265
10266 // fill destinations path tail
10267 uint32 sourcepath = 0;
10268 uint32 totalcost = 0;
10269 uint32 firstcost = 0;
10270
10271 uint32 prevnode = sourcenode;
10272 uint32 lastnode = 0;
10273
10274 for (uint32 i = 1; i < nodes.size(); ++i)
10275 {
10276 uint32 path, cost;
10277
10278 lastnode = nodes[i];
10279 sObjectMgr->GetTaxiPath(prevnode, lastnode, path, cost);
10280
10281 if (!path)
10282 {
10284 return false;
10285 }
10286
10287 totalcost += cost;
10288 if (i == 1)
10289 firstcost = cost;
10290
10291 if (prevnode == sourcenode)
10292 sourcepath = path;
10293
10294 m_taxi.AddTaxiDestination(lastnode);
10295
10296 prevnode = lastnode;
10297 }
10298
10299 // get mount model (in case non taximaster (npc == nullptr) allow more wide lookup)
10300 //
10301 // Hack-Fix for Alliance not being able to use Acherus taxi. There is
10302 // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes
10303 // change but I couldn't find a suitable alternative. OK to use class because only DK
10304 // can use this taxi.
10305 uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TAXI)));
10306
10307 // in spell case allow 0 model
10308 if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0)
10309 {
10312 return false;
10313 }
10314
10315 uint32 money = GetMoney();
10316
10317 if (npc)
10318 {
10319 float discount = GetReputationPriceDiscount(npc);
10320 totalcost = uint32(ceil(totalcost * discount));
10321 firstcost = uint32(ceil(firstcost * discount));
10323 }
10324 else
10325 {
10327 }
10328
10329 if (money < totalcost)
10330 {
10333 return false;
10334 }
10335
10336 //Checks and preparations done, DO FLIGHT
10338
10339 // prevent stealth flight
10340 //RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
10341
10342 // Xinef: dont use instant flight paths if spellid is present (custom calls use spellid = 1)
10343 if ((sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 1 || (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && m_isInstantFlightOn)) && !spellid)
10344 {
10345 TaxiNodesEntry const* lastPathNode = sTaxiNodesStore.LookupEntry(nodes[nodes.size() - 1]);
10347 ModifyMoney(-(int32)totalcost);
10349 TeleportTo(lastPathNode->map_id, lastPathNode->x, lastPathNode->y, lastPathNode->z, GetOrientation());
10350 return false;
10351 }
10352 else
10353 {
10354 m_flightSpellActivated = spellid;
10355 ModifyMoney(-(int32)firstcost);
10358 GetSession()->SendDoFlight(mount_display_id, sourcepath);
10359 }
10360 return true;
10361}
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:540
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:539
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:541
@ CLASS_CONTEXT_TAXI
Definition: UnitDefines.h:231
@ UNIT_STATE_ROOT
Definition: UnitDefines.h:180
@ UNIT_STATE_STUNNED
Definition: UnitDefines.h:173
@ UNIT_FLAG_DISABLE_MOVE
Definition: UnitDefines.h:252
@ SPELL_AURA_MOD_SHAPESHIFT
Definition: SpellAuraDefines.h:99
@ CONFIG_INSTANT_TAXI
Definition: IWorld.h:386
npc
Definition: BattlegroundSA.h:47
@ ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN
Definition: DBCEnums.h:215
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING
Definition: DBCEnums.h:176
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
@ ERR_TAXIPLAYERBUSY
Definition: SharedDefines.h:3618
@ ERR_TAXIOK
Definition: SharedDefines.h:3611
@ ERR_TAXINOSUCHPATH
Definition: SharedDefines.h:3613
@ ERR_TAXIUNSPECIFIEDSERVERERROR
Definition: SharedDefines.h:3612
@ ERR_TAXIPLAYERSHAPESHIFTED
Definition: SharedDefines.h:3620
@ ERR_TAXIPLAYERALREADYMOUNTED
Definition: SharedDefines.h:3619
@ ERR_TAXINOTENOUGHMONEY
Definition: SharedDefines.h:3614
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2118
float GetReputationPriceDiscount(Creature const *creature) const
Definition: Player.cpp:12284
void TradeCancel(bool sendback, TradeStatus status=TRADE_STATUS_TRADE_CANCELED)
Definition: PlayerStorage.cpp:4088
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1339
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9306
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13101
void AddTaxiDestination(uint32 dest)
Definition: PlayerTaxi.h:62
void SetFlightMasterFactionTemplateId(uint32 factionTemplateId)
Definition: PlayerTaxi.h:75
void ClearTaxiDestinations()
Definition: PlayerTaxi.h:61
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4093
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10480
bool IsInDisallowedMountForm() const
Definition: Unit.cpp:21031
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:702
bool IsMounted() const
Definition: Unit.h:1791
bool HasUnitState(const uint32 f) const
Definition: Unit.h:691
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5143
bool IsInCombat() const
Definition: Unit.h:877
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19501
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:1493
void SendActivateTaxiReply(ActivateTaxiReply reply)
Definition: TaxiHandler.cpp:279
void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode=0)
Definition: TaxiHandler.cpp:109
Definition: Spell.h:287
Definition: DBCStructure.h:1954
float z
Definition: DBCStructure.h:1959
uint32 map_id
Definition: DBCStructure.h:1956
float x
Definition: DBCStructure.h:1957
float y
Definition: DBCStructure.h:1958

References ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, PlayerTaxi::AddTaxiDestination(), CLASS_CONTEXT_TAXI, CLASS_DEATH_KNIGHT, PlayerTaxi::ClearTaxiDestinations(), Unit::CombatStop(), CONFIG_INSTANT_TAXI, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, ERR_TAXINOSUCHPATH, ERR_TAXINOTENOUGHMONEY, ERR_TAXIOK, ERR_TAXIPLAYERALREADYMOUNTED, ERR_TAXIPLAYERBUSY, ERR_TAXIPLAYERSHAPESHIFTED, ERR_TAXIUNSPECIFIEDSERVERERROR, Unit::ExitVehicle(), Unit::GetCurrentSpell(), GetMoney(), Position::GetOrientation(), GetReputationPriceDiscount(), GetSession(), GetTeamId(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::InterruptSpell(), IsClass(), Unit::IsInCombat(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), m_flightSpellActivated, m_isInstantFlightOn, m_taxi, TaxiNodesEntry::map_id, ModifyMoney(), Unit::RemoveAurasByType(), WorldSession::SendActivateTaxiReply(), WorldSession::SendDoFlight(), PlayerTaxi::SetFlightMasterFactionTemplateId(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiNodesStore, StopCastingBindSight(), StopCastingCharm(), sWorld, TeleportTo(), TradeCancel(), UNIT_FLAG_DISABLE_MOVE, UNIT_STATE_ROOT, UNIT_STATE_STUNNED, UpdateAchievementCriteria(), TaxiNodesEntry::x, TaxiNodesEntry::y, and TaxiNodesEntry::z.

Referenced by ActivateTaxiPathTo(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), Aura::HandleAuraSpecificMods(), OPvPCapturePointNA::HandleCustomSpell(), npc_taxi::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), and npc_karynaku::OnQuestAccept().

◆ ActivateTaxiPathTo() [2/2]

bool Player::ActivateTaxiPathTo ( uint32  taxi_path_id,
uint32  spellid = 1 
)
10364{
10365 TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(taxi_path_id);
10366 if (!entry)
10367 return false;
10368
10369 std::vector<uint32> nodes;
10370
10371 nodes.resize(2);
10372 nodes[0] = entry->from;
10373 nodes[1] = entry->to;
10374
10375 return ActivateTaxiPathTo(nodes, nullptr, spellid);
10376}
DBCStorage< TaxiPathEntry > sTaxiPathStore(TaxiPathEntryfmt)
bool ActivateTaxiPathTo(std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
Definition: Player.cpp:10181
Definition: DBCStructure.h:1966
uint32 to
Definition: DBCStructure.h:1969
uint32 from
Definition: DBCStructure.h:1968

References ActivateTaxiPathTo(), TaxiPathEntry::from, sTaxiPathStore, and TaxiPathEntry::to.

◆ addActionButton()

ActionButton * Player::addActionButton ( uint8  button,
uint32  action,
uint8  type 
)
5631{
5632 if (!IsActionButtonDataValid(button, action, type))
5633 return nullptr;
5634
5635 // it create new button (NEW state) if need or return existed
5636 ActionButton& ab = m_actionButtons[button];
5637
5638 // set data and update to CHANGED if not NEW
5639 ab.SetActionAndType(action, ActionButtonType(type));
5640
5641 LOG_DEBUG("entities.player", "Player {} Added Action {} (type {}) to Button {}", GetGUID().ToString(), action, type, button);
5642 return &ab;
5643}
ActionButtonType
Definition: Player.h:229
void SetActionAndType(uint32 action, ActionButtonType type)
Definition: Player.h:268
bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
Definition: Player.cpp:5587

References Object::GetGUID(), IsActionButtonDataValid(), LOG_DEBUG, m_actionButtons, ActionButton::SetActionAndType(), and Position::ToString().

Referenced by _LoadActions(), Create(), and WorldSession::HandleSetActionButtonOpcode().

◆ AddArmorProficiency()

void Player::AddArmorProficiency ( uint32  newflag)
inline
1371{ m_ArmorProficiency |= newflag; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ AddBattlegroundQueueId()

uint32 Player::AddBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12193{
12194 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12195 {
12196 if (_BgBattlegroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || _BgBattlegroundQueueID[i].bgQueueTypeId == val)
12197 {
12198 _BgBattlegroundQueueID[i].bgQueueTypeId = val;
12199 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12200 return i;
12201 }
12202 }
12203
12205}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattlemasterJoinArena(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ AddBonusTalent()

void Player::AddBonusTalent ( uint32  count)
inline
1744{ m_extraBonusTalentCount += count; };

References m_extraBonusTalentCount.

◆ AddEnchantmentDuration()

void Player::AddEnchantmentDuration ( Item item,
EnchantmentSlot  slot,
uint32  duration 
)
4275{
4276 if (!item)
4277 return;
4278
4279 if (slot >= MAX_ENCHANTMENT_SLOT)
4280 return;
4281
4282 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4283 {
4284 if (itr->item == item && itr->slot == slot)
4285 {
4286 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4287 m_enchantDuration.erase(itr);
4288 break;
4289 }
4290 }
4291 if (item && duration > 0)
4292 {
4293 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), item->GetGUID(), slot, uint32(duration / 1000));
4294 m_enchantDuration.push_back(EnchantDuration(item, slot, duration));
4295 }
4296}
@ MAX_ENCHANTMENT_SLOT
Definition: Item.h:183
Definition: Player.h:447
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
Definition: ItemHandler.cpp:1234

References Object::GetGUID(), GetSession(), m_enchantDuration, MAX_ENCHANTMENT_SLOT, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by AddEnchantmentDurations(), and ApplyEnchantment().

◆ AddEnchantmentDurations()

void Player::AddEnchantmentDurations ( Item item)
4187{
4188 for (int x = 0; x < MAX_ENCHANTMENT_SLOT; ++x)
4189 {
4190 if (!item->GetEnchantmentId(EnchantmentSlot(x)))
4191 continue;
4192
4193 uint32 duration = item->GetEnchantmentDuration(EnchantmentSlot(x));
4194 if (duration > 0)
4195 AddEnchantmentDuration(item, EnchantmentSlot(x), duration);
4196 }
4197}
EnchantmentSlot
Definition: Item.h:168
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:304
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
Definition: Item.h:305
void AddEnchantmentDuration(Item *item, EnchantmentSlot slot, uint32 duration)
Definition: PlayerStorage.cpp:4274

References AddEnchantmentDuration(), Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), and MAX_ENCHANTMENT_SLOT.

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddInstanceEnterTime()

void Player::AddInstanceEnterTime ( uint32  instanceId,
time_t  enterTime 
)
inline
2461 {
2462 if (_instanceResetTimes.find(instanceId) == _instanceResetTimes.end())
2463 _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR));
2464 }

References _instanceResetTimes, and HOUR.

Referenced by InstanceMap::AddPlayerToMap().

◆ AddItem()

bool Player::AddItem ( uint32  itemId,
uint32  count 
)
15502{
15503 uint32 noSpaceForCount = 0;
15504 ItemPosCountVec dest;
15505 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
15506 if (msg != EQUIP_ERR_OK)
15507 count -= noSpaceForCount;
15508
15509 if (count == 0 || dest.empty())
15510 {
15511 // -- TODO: Send to mailbox if no space
15512 ChatHandler(GetSession()).PSendSysMessage("You don't have any space in your bags.");
15513 return false;
15514 }
15515
15516 Item* item = StoreNewItem(dest, itemId, true);
15517 if (item)
15518 SendNewItem(item, count, true, false);
15519 else
15520 return false;
15521 return true;
15522}
@ NULL_BAG
Definition: Item.h:40
Definition: Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:211

References CanStoreNewItem(), EQUIP_ERR_OK, GetSession(), NULL_BAG, NULL_SLOT, ChatHandler::PSendSysMessage(), SendNewItem(), and StoreNewItem().

Referenced by spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), spell_q9452_cast_net::HandleDummy(), spell_catch_the_wild_wolpertinger::HandleEffectApply(), RewardHonor(), and npc_tharnarian::npc_tharnarianAI::sGossipSelect().

◆ AddItemDurations()

void Player::AddItemDurations ( Item item)
12403{
12405 {
12406 m_itemDuration.push_back(item);
12407 item->SendTimeUpdate(this);
12408 }
12409}
@ ITEM_FIELD_DURATION
Definition: UpdateFields.h:40
void SendTimeUpdate(Player *owner)
Definition: Item.cpp:1075
ItemDurationList m_itemDuration
Definition: Player.h:2847

References Object::GetUInt32Value(), ITEM_FIELD_DURATION, m_itemDuration, and Item::SendTimeUpdate().

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddItemToBuyBackSlot()

void Player::AddItemToBuyBackSlot ( Item pItem,
uint32  money 
)
3937{
3938 if (pItem)
3939 {
3941 // if current back slot non-empty search oldest or free
3942 if (m_items[slot])
3943 {
3945 uint32 oldest_slot = BUYBACK_SLOT_START;
3946
3947 for (uint32 i = BUYBACK_SLOT_START + 1; i < BUYBACK_SLOT_END; ++i)
3948 {
3949 // found empty
3950 if (!m_items[i])
3951 {
3952 slot = i;
3953 break;
3954 }
3955
3957
3958 if (oldest_time > i_time)
3959 {
3960 oldest_time = i_time;
3961 oldest_slot = i;
3962 }
3963 }
3964
3965 // find oldest
3966 slot = oldest_slot;
3967 }
3968
3969 RemoveItemFromBuyBackSlot(slot, true);
3970 LOG_DEBUG("entities.player.items", "STORAGE: AddItemToBuyBackSlot item = {}, slot = {}", pItem->GetEntry(), slot);
3971
3972 m_items[slot] = pItem;
3973 time_t base = GameTime::GetGameTime().count();
3974 uint32 etime = uint32(base - m_logintime + (30 * 3600));
3975 uint32 eslot = slot - BUYBACK_SLOT_START;
3976
3980
3981 // move to next (for non filled list is move most optimized choice)
3984 }
3985}
@ PLAYER_FIELD_BUYBACK_PRICE_1
Definition: UpdateFields.h:372
@ PLAYER_FIELD_VENDORBUYBACK_SLOT_1
Definition: UpdateFields.h:331
@ PLAYER_FIELD_BUYBACK_TIMESTAMP_1
Definition: UpdateFields.h:373
void RemoveItemFromBuyBackSlot(uint32 slot, bool del)
Definition: PlayerStorage.cpp:3995

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, Object::GetEntry(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetUInt32Value(), LOG_DEBUG, m_currentBuybackSlot, m_items, m_logintime, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, RemoveItemFromBuyBackSlot(), Object::SetGuidValue(), and Unit::SetUInt32Value().

Referenced by WorldSession::HandleSellItemOpcode().

◆ AdditionalSavingAddMask()

◆ AddKnownCurrency()

void Player::AddKnownCurrency ( uint32  itemId)
private
14155{
14156 if (CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemId))
14157 SetFlag64(PLAYER_FIELD_KNOWN_CURRENCIES, (1LL << (ctEntry->BitIndex - 1)));
14158}
DBCStorage< CurrencyTypesEntry > sCurrencyTypesStore(CurrencyTypesfmt)
void SetFlag64(uint16 index, uint64 newFlag)
Definition: Object.cpp:956
Definition: DBCStructure.h:835

References PLAYER_FIELD_KNOWN_CURRENCIES, sCurrencyTypesStore, and Object::SetFlag64().

Referenced by _StoreItem(), SetArenaPoints(), and SetHonorPoints().

◆ AddMail()

void Player::AddMail ( Mail mail)
inline
1657{ m_mail.push_front(mail); }// for call from WorldSession::SendMailTo

References m_mail.

Referenced by MailDraft::SendMailTo().

◆ AddMItem()

void Player::AddMItem ( Item it)
inline
1683 {
1684 ASSERT(it);
1685 //ASSERT deleted, because items can be added before loading
1686 mMitems[it->GetGUID().GetCounter()] = it;
1687 }

References ASSERT, ObjectGuid::GetCounter(), Object::GetGUID(), and mMitems.

Referenced by _LoadMailedItem(), and MailDraft::SendMailTo().

◆ AddNewMailDeliverTime()

void Player::AddNewMailDeliverTime ( time_t  deliver_time)
2892{
2893 if (deliver_time <= GameTime::GetGameTime().count()) // ready now
2894 {
2895 ++unReadMails;
2896 SendNewMail();
2897 }
2898 else // not ready and no have ready mails
2899 {
2900 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > deliver_time)
2901 m_nextMailDelivereTime = deliver_time;
2902 }
2903}
void SendNewMail()
Definition: Player.cpp:2883

References GameTime::GetGameTime(), m_nextMailDelivereTime, SendNewMail(), and unReadMails.

Referenced by MailDraft::SendMailTo().

◆ AddQuest()

void Player::AddQuest ( Quest const *  quest,
Object questGiver 
)
508{
509 uint16 log_slot = FindQuestSlot(0);
510
511 if (log_slot >= MAX_QUEST_LOG_SIZE) // Player does not have any free slot in the quest log
512 return;
513
514 uint32 quest_id = quest->GetQuestId();
515
516 // if not exist then created with set uState == NEW and rewarded=false
517 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
518
519 // check for repeatable quests status reset
520 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
521 questStatusData.Explored = false;
522
523 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
524 {
525 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
526 questStatusData.ItemCount[i] = 0;
527 }
528
530 {
531 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
532 questStatusData.CreatureOrGOCount[i] = 0;
533 }
534
535 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL))
536 questStatusData.PlayerCount = 0;
537
538 GiveQuestSourceItem(quest);
539 AdjustQuestReqItemCount(quest, questStatusData);
540
541 if (quest->GetRepObjectiveFaction())
542 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction()))
543 GetReputationMgr().SetVisible(factionEntry);
544
545 if (quest->GetRepObjectiveFaction2())
546 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction2()))
547 GetReputationMgr().SetVisible(factionEntry);
548
549 uint32 qtime = 0;
550 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
551 {
552 uint32 timeAllowed = quest->GetTimeAllowed();
553
554 // shared timed quest
555 if (questGiver && questGiver->IsPlayer())
556 timeAllowed = questGiver->ToPlayer()->getQuestStatusMap()[quest_id].Timer / IN_MILLISECONDS;
557
558 AddTimedQuest(quest_id);
559 questStatusData.Timer = timeAllowed * IN_MILLISECONDS;
560 qtime = static_cast<uint32>(GameTime::GetGameTime().count()) + timeAllowed;
561 }
562 else
563 questStatusData.Timer = 0;
564
565 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
566 {
567 pvpInfo.IsHostile = true;
569 }
570
571 SetQuestSlot(log_slot, quest_id, qtime);
572
573 m_QuestStatusSave[quest_id] = true;
574
576
577 SendQuestUpdate(quest_id);
578
579 // check if Quest Tracker is enabled
580 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
581 {
582 // prepare Quest Tracker datas
583 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK);
584 stmt->SetData(0, quest_id);
585 stmt->SetData(1, GetGUID().GetCounter());
586 stmt->SetData(2, GitRevision::GetHash());
587 stmt->SetData(3, GitRevision::GetDate());
588
589 // add to Quest Tracker
590 CharacterDatabase.Execute(stmt);
591 }
592
593 // Xinef: area auras may change on quest accept!
596}
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ CONFIG_QUEST_ENABLE_QUEST_TRACKER
Definition: IWorld.h:144
@ QUEST_FLAGS_FLAGS_PVP
Definition: QuestDef.h:145
@ QUEST_SPECIAL_FLAGS_CAST
Definition: QuestDef.h:165
@ QUEST_SPECIAL_FLAGS_DELIVER
Definition: QuestDef.h:175
@ QUEST_SPECIAL_FLAGS_KILL
Definition: QuestDef.h:177
@ QUEST_SPECIAL_FLAGS_SPEAKTO
Definition: QuestDef.h:176
@ QUEST_SPECIAL_FLAGS_PLAYER_KILL
Definition: QuestDef.h:179
@ CHAR_INS_QUEST_TRACK
Definition: CharacterDatabase.h:503
@ ACHIEVEMENT_TIMED_TYPE_QUEST
Definition: DBCEnums.h:111
AC_COMMON_API char const * GetDate()
Definition: GitRevision.cpp:26
AC_COMMON_API char const * GetHash()
Definition: GitRevision.cpp:21
bool IsPlayer() const
Definition: Object.h:201
Player * ToPlayer()
Definition: Object.h:202
uint32 GetAreaId() const
Definition: Object.cpp:3156
bool IsHostile
Definition: Player.h:366
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition: Player.cpp:13866
QuestStatusMap & getQuestStatusMap()
Definition: Player.h:1635
uint16 FindQuestSlot(uint32 quest_id) const
Definition: PlayerQuest.cpp:1782
void UpdatePvPState()
Definition: PlayerUpdates.cpp:1440
void UpdateAreaDependentAuras(uint32 area_id)
Definition: PlayerUpdates.cpp:1867
void SendQuestUpdate(uint32 questId)
Definition: PlayerQuest.cpp:1526
void AdjustQuestReqItemCount(Quest const *quest, QuestStatusData &questStatusData)
Definition: PlayerQuest.cpp:1764
PvPInfo pvpInfo
Definition: Player.h:1855
void UpdateZoneDependentAuras(uint32 zone_id)
Definition: PlayerUpdates.cpp:1853
bool GiveQuestSourceItem(Quest const *quest)
Definition: PlayerQuest.cpp:1335
ReputationMgr & GetReputationMgr()
Definition: Player.h:2135
void SetVisible(FactionTemplateEntry const *factionTemplateEntry)
Definition: ReputationMgr.cpp:458
Definition: DBCStructure.h:907

References ACHIEVEMENT_TIMED_TYPE_QUEST, AddTimedQuest(), AdjustQuestReqItemCount(), CHAR_INS_QUEST_TRACK, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, FindQuestSlot(), WorldObject::GetAreaId(), GitRevision::GetDate(), GameTime::GetGameTime(), Object::GetGUID(), GitRevision::GetHash(), Quest::GetQuestId(), getQuestStatusMap(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveFaction2(), GetReputationMgr(), Quest::GetTimeAllowed(), WorldObject::GetZoneId(), GiveQuestSourceItem(), Quest::HasFlag(), Quest::HasSpecialFlag(), IN_MILLISECONDS, PvPInfo::IsHostile, Object::IsPlayer(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QuestStatusData::PlayerCount, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, SendQuestUpdate(), SetQuestSlot(), ReputationMgr::SetVisible(), sFactionStore, StartTimedAchievement(), QuestStatusData::Status, sWorld, QuestStatusData::Timer, Object::ToPlayer(), UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion().

◆ AddQuestAndCheckCompletion()

void Player::AddQuestAndCheckCompletion ( Quest const *  quest,
Object questGiver 
)
422{
423 AddQuest(quest, questGiver);
424
425 if (CanCompleteQuest(quest->GetQuestId()))
426 CompleteQuest(quest->GetQuestId());
427
428 if (!questGiver)
429 return;
430
431 switch (questGiver->GetTypeId())
432 {
433 case TYPEID_UNIT:
434 sScriptMgr->OnQuestAccept(this, questGiver->ToCreature(), quest);
435 questGiver->ToCreature()->AI()->sQuestAccept(this, quest);
436 break;
437 case TYPEID_ITEM:
438 case TYPEID_CONTAINER:
439 {
440 Item* item = (Item*)questGiver;
441 sScriptMgr->OnQuestAccept(this, item, quest);
442
443 // destroy not required for quest finish quest starting item
444 bool destroyItem = true;
445 for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
446 {
447 if (quest->RequiredItemId[i] == item->GetEntry() && item->GetTemplate()->MaxCount > 0)
448 {
449 destroyItem = false;
450 break;
451 }
452 }
453
454 if (destroyItem)
455 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
456
457 break;
458 }
460 sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest);
461 questGiver->ToGameObject()->AI()->QuestAccept(this, quest);
462 break;
463 default:
464 break;
465 }
466}
@ TYPEID_GAMEOBJECT
Definition: ObjectGuid.h:37
@ TYPEID_UNIT
Definition: ObjectGuid.h:35
@ TYPEID_ITEM
Definition: ObjectGuid.h:33
@ TYPEID_CONTAINER
Definition: ObjectGuid.h:34
virtual bool QuestAccept(Player *, Quest const *)
Definition: GameObjectAI.h:57
virtual void sQuestAccept(Player *, Quest const *)
Definition: UnitAI.h:414
CreatureAI * AI() const
Definition: Creature.h:141
GameObjectAI * AI() const
Definition: GameObject.h:305
int32 MaxCount
Definition: ItemTemplate.h:644
TypeID GetTypeId() const
Definition: Object.h:128
GameObject * ToGameObject()
Definition: Object.h:214
Creature * ToCreature()
Definition: Object.h:206
void AddQuest(Quest const *quest, Object *questGiver)
Definition: PlayerQuest.cpp:507
void CompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:598
void DestroyItem(uint8 bag, uint8 slot, bool update)
Definition: PlayerStorage.cpp:3023
bool CanCompleteQuest(uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
Definition: PlayerQuest.cpp:289

References AddQuest(), Creature::AI(), GameObject::AI(), CanCompleteQuest(), CompleteQuest(), DestroyItem(), Item::GetBagSlot(), Object::GetEntry(), Quest::GetQuestId(), Item::GetSlot(), Item::GetTemplate(), Object::GetTypeId(), ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, GameObjectAI::QuestAccept(), Quest::RequiredItemId, UnitAI::sQuestAccept(), sScriptMgr, Object::ToCreature(), Object::ToGameObject(), TYPEID_CONTAINER, TYPEID_GAMEOBJECT, TYPEID_ITEM, and TYPEID_UNIT.

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ AddReceivedSpectatorResetFor()

void Player::AddReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2595{ m_receivedSpectatorResetFor.insert(guid); }
GuidSet m_receivedSpectatorResetFor
Definition: Player.h:2599

References m_receivedSpectatorResetFor.

Referenced by ArenaSpectator::HandleResetCommand().

◆ AddRefundReference()

void Player::AddRefundReference ( ObjectGuid  itemGUID)
15450{
15451 m_refundableItems.insert(itemGUID);
15452}

References m_refundableItems.

Referenced by _LoadItem(), and _StoreOrEquipNewItem().

◆ AddRuneByAuraEffect()

void Player::AddRuneByAuraEffect ( uint8  index,
RuneType  newType,
AuraEffect const *  aura 
)
inline
2529{ SetRuneConvertAura(index, aura); ConvertRune(index, newType); }
void ConvertRune(uint8 index, RuneType newType)
Definition: Player.cpp:13362
void SetRuneConvertAura(uint8 index, AuraEffect const *aura)
Definition: Player.h:2528

References ConvertRune(), and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune().

◆ AddRunePower()

void Player::AddRunePower ( uint8  index)
13385{
13387 data << uint32(1 << index); // mask (0x00-0x3F probably)
13388 GetSession()->SendPacket(&data);
13389}
@ SMSG_ADD_RUNE_POWER
Definition: Opcodes.h:1190

References GetSession(), WorldSession::SendPacket(), and SMSG_ADD_RUNE_POWER.

◆ addSpell()

bool Player::addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  updateActive,
bool  temporary = false,
bool  learnFromSkill = false 
)
3057{
3058 if (!_addSpell(spellId, addSpecMask, temporary, learnFromSkill))
3059 return false;
3060
3061 if (!updateActive)
3062 return true;
3063
3064 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); // must exist, checked in _addSpell
3065
3066 // pussywizard: now update active state for all ranks of this spell! and send packet to swap on action bar
3067 // pussywizard: assumption - it's in all specs, can't be a talent
3068 if (!spellInfo->IsStackableWithRanks() && spellInfo->IsRanked())
3069 {
3070 SpellInfo const* nextSpellInfo = sSpellMgr->GetSpellInfo(sSpellMgr->GetFirstSpellInChain(spellInfo->Id));
3071 while (nextSpellInfo)
3072 {
3073 PlayerSpellMap::iterator itr = m_spells.find(nextSpellInfo->Id);
3074 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active)
3075 {
3076 if (nextSpellInfo->GetRank() < spellInfo->GetRank())
3077 {
3078 itr->second->Active = false;
3079 if (IsInWorld())
3080 {
3082 data << uint32(nextSpellInfo->Id);
3083 data << uint32(spellInfo->Id);
3084 GetSession()->SendPacket(&data);
3085 }
3086 return false;
3087 }
3088 else if (nextSpellInfo->GetRank() > spellInfo->GetRank())
3089 {
3090 PlayerSpellMap::iterator itr2 = m_spells.find(spellInfo->Id);
3091 if (itr2 != m_spells.end())
3092 itr2->second->Active = false;
3093 return false;
3094 }
3095 }
3096 nextSpellInfo = nextSpellInfo->GetNextRankSpell();
3097 }
3098 }
3099
3100 return true;
3101}
@ SMSG_SUPERCEDED_SPELL
Definition: Opcodes.h:330
uint8 GetRank() const
Definition: SpellInfo.cpp:2494
bool IsRanked() const
Definition: SpellInfo.cpp:2489
bool IsStackableWithRanks() const
Definition: SpellInfo.cpp:1145
SpellInfo const * GetNextRankSpell() const
Definition: SpellInfo.cpp:2513

References _addSpell(), SpellInfo::GetNextRankSpell(), SpellInfo::GetRank(), GetSession(), SpellInfo::Id, Object::IsInWorld(), SpellInfo::IsRanked(), SpellInfo::IsStackableWithRanks(), m_spells, PLAYERSPELL_REMOVED, WorldSession::SendPacket(), SMSG_SUPERCEDED_SPELL, and sSpellMgr.

Referenced by _LoadSpells(), LearnCustomSpells(), learnSkillRewardedSpells(), and learnSpell().

◆ AddSpellAndCategoryCooldowns()

void Player::AddSpellAndCategoryCooldowns ( SpellInfo const *  spellInfo,
uint32  itemId,
Spell spell = nullptr,
bool  infinityCooldown = false 
)
10859{
10860 // init cooldown values
10861 uint32 cat = 0;
10862 int32 rec = -1;
10863 int32 catrec = -1;
10864
10865 // some special item spells without correct cooldown in SpellInfo
10866 // cooldown information stored in item prototype
10867 // This used in same way in WorldSession::HandleItemQuerySingleOpcode data sending to client.
10868
10869 if (itemId)
10870 {
10871 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))
10872 {
10873 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
10874 {
10875 if (uint32(proto->Spells[idx].SpellId) == spellInfo->Id)
10876 {
10877 cat = proto->Spells[idx].SpellCategory;
10878 rec = proto->Spells[idx].SpellCooldown;
10879 catrec = proto->Spells[idx].SpellCategoryCooldown;
10880 break;
10881 }
10882 }
10883 }
10884 }
10885
10886 // if no cooldown found above then base at DBC data
10887 if (rec < 0 && catrec < 0)
10888 {
10889 cat = spellInfo->GetCategory();
10890 rec = spellInfo->RecoveryTime;
10891 catrec = spellInfo->CategoryRecoveryTime;
10892 }
10893
10894 time_t catrecTime;
10895 time_t recTime;
10896
10897 bool needsCooldownPacket = false;
10898
10899 // overwrite time for selected category
10900 if (infinityCooldown)
10901 {
10902 // use +MONTH as infinity mark for spell cooldown (will checked as MONTH/2 at save ans skipped)
10903 // but not allow ignore until reset or re-login
10904 catrecTime = catrec > 0 ? infinityCooldownDelay : 0;
10905 recTime = rec > 0 ? infinityCooldownDelay : catrecTime;
10906 }
10907 else
10908 {
10909 // shoot spells used equipped item cooldown values already assigned in GetAttackTime(RANGED_ATTACK)
10910 // prevent 0 cooldowns set by another way
10911 if (rec <= 0 && catrec <= 0 && (cat == 76 || (spellInfo->IsAutoRepeatRangedSpell() && spellInfo->Id != 75)))
10913
10914 // Now we have cooldown data (if found any), time to apply mods
10915 if (rec > 0)
10916 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, rec, spell);
10917
10918 if (catrec > 0 && !spellInfo->HasAttribute(SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS))
10919 {
10920 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, catrec, spell);
10921 }
10922
10924 {
10925 // Apply SPELL_AURA_MOD_COOLDOWN only to own spells
10926 if (HasSpell(spellInfo->Id))
10927 {
10928 needsCooldownPacket = true;
10929 rec += cooldownMod * IN_MILLISECONDS; // SPELL_AURA_MOD_COOLDOWN does not affect category cooldows, verified with shaman shocks
10930 }
10931 }
10932
10933 // replace negative cooldowns by 0
10934 if (rec < 0) rec = 0;
10935 if (catrec < 0) catrec = 0;
10936
10937 // no cooldown after applying spell mods
10938 if (rec == 0 && catrec == 0)
10939 return;
10940
10941 catrecTime = catrec ? catrec : 0;
10942 recTime = rec ? rec : catrecTime;
10943 }
10944
10945 // category spells
10946 if (cat && catrec > 0)
10947 {
10948 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
10949 if (needsCooldownPacket)
10950 {
10951 WorldPacket data;
10952 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, recTime);
10953 SendDirectMessage(&data);
10954 }
10955
10956 PacketCooldowns forcedCategoryCooldowns;
10957
10958 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
10959 if (i_scstore != sSpellsByCategoryStore.end())
10960 {
10961 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
10962 {
10963 if (i_scset->second == spellInfo->Id) // skip main spell, already handled above
10964 {
10965 continue;
10966 }
10967
10968 // If spell category is applied by item, then other spells should be exists in item templates
10969 if ((itemId > 0) != i_scset->first)
10970 {
10971 continue;
10972 }
10973
10974 // Only within the same spellfamily
10975 SpellInfo const* categorySpellInfo = sSpellMgr->GetSpellInfo(i_scset->second);
10976 if (!categorySpellInfo || categorySpellInfo->SpellFamilyName != spellInfo->SpellFamilyName)
10977 {
10978 continue;
10979 }
10980
10981 _AddSpellCooldown(i_scset->second, cat, itemId, catrecTime, !spellInfo->IsCooldownStartedOnEvent() && catrec && rec && catrec != rec);
10982
10983 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS))
10984 {
10985 forcedCategoryCooldowns[i_scset->second] = catrecTime;
10986 }
10987 }
10988 }
10989
10990 if (!forcedCategoryCooldowns.empty())
10991 {
10992 WorldPacket data;
10993 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, forcedCategoryCooldowns);
10994 SendDirectMessage(&data);
10995 }
10996 }
10997 else
10998 {
10999 // self spell cooldown
11000 if (recTime > 0)
11001 {
11002 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
11003
11004 if (needsCooldownPacket)
11005 {
11006 WorldPacket data;
11007 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, rec);
11008 SendDirectMessage(&data);
11009 }
11010 }
11011 }
11012}
SpellCategoryStore sSpellsByCategoryStore
Definition: DBCStores.cpp:152
static constexpr uint32 infinityCooldownDelay
Definition: Unit.h:47
@ SPELL_COOLDOWN_FLAG_NONE
Definition: Unit.h:606
std::unordered_map< uint32, uint32 > PacketCooldowns
Definition: Unit.h:611
#define MAX_ITEM_SPELLS
Definition: Item.h:215
@ SPELLMOD_COOLDOWN
Definition: SpellDefines.h:87
@ SPELL_AURA_MOD_COOLDOWN
Definition: SpellAuraDefines.h:259
@ SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS
Definition: SpellInfo.h:204
@ SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS
Definition: SharedDefines.h:635
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5713
void ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
Definition: Player.cpp:9741
void BuildCooldownPacket(WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
Definition: Unit.cpp:20749
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:857
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5966
uint32 SpellFamilyName
Definition: SpellInfo.h:387

References _AddSpellCooldown(), ApplySpellMod(), Unit::BuildCooldownPacket(), SpellInfo::CategoryRecoveryTime, Unit::GetAttackTime(), SpellInfo::GetCategory(), Unit::GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasSpell(), SpellInfo::Id, IN_MILLISECONDS, infinityCooldownDelay, SpellInfo::IsAutoRepeatRangedSpell(), SpellInfo::IsCooldownStartedOnEvent(), MAX_ITEM_SPELLS, RANGED_ATTACK, SpellInfo::RecoveryTime, SendDirectMessage(), sObjectMgr, SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS, SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS, SPELL_AURA_MOD_COOLDOWN, SPELL_COOLDOWN_FLAG_NONE, SpellInfo::SpellFamilyName, SPELLMOD_COOLDOWN, sSpellMgr, and sSpellsByCategoryStore.

Referenced by Aura::_ApplyForTarget(), Unit::AddGameObject(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), SendCooldownEvent(), Spell::SendSpellCooldown(), and Unit::SetMinion().

◆ AddSpellCooldown()

void Player::AddSpellCooldown ( uint32  spell_id,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
overridevirtual

◆ AddSpellMod()

void Player::AddSpellMod ( SpellModifier mod,
bool  apply 
)
9839{
9840 LOG_DEBUG("spells.aura", "Player::AddSpellMod {}", mod->spellId);
9842
9843 int i = 0;
9844 flag96 _mask = 0;
9845 for (int eff = 0; eff < 96; ++eff)
9846 {
9847 if (eff != 0 && eff % 32 == 0)
9848 _mask[i++] = 0;
9849
9850 _mask[i] = uint32(1) << (eff - (32 * i));
9851 if (mod->mask & _mask)
9852 {
9853 int32 val = 0;
9854 for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr)
9855 {
9856 if ((*itr)->type == mod->type && (*itr)->mask & _mask)
9857 val += (*itr)->value;
9858 }
9859 val += apply ? mod->value : -(mod->value);
9860 WorldPacket data(Opcode, (1 + 1 + 4));
9861 data << uint8(eff);
9862 data << uint8(mod->op);
9863 data << int32(val);
9864 SendDirectMessage(&data);
9865 }
9866 }
9867
9868 if (apply)
9869 {
9870 m_spellMods[mod->op].push_back(mod);
9871 m_spellMods[mod->op].sort(SpellModPredicate());
9872 }
9873 else
9874 {
9875 m_spellMods[mod->op].remove(mod);
9876 // mods bound to aura will be removed in AuraEffect::~AuraEffect
9877 if (!mod->ownerAura)
9878 delete mod;
9879 }
9880}
@ SPELLMOD_FLAT
Definition: Player.h:93
@ SMSG_SET_FLAT_SPELL_MODIFIER
Definition: Opcodes.h:644
@ SMSG_SET_PCT_SPELL_MODIFIER
Definition: Opcodes.h:645
void apply(T *val)
Definition: ByteConverter.h:40
Definition: Util.h:451
Definition: Player.cpp:9829
SpellModOp op
Definition: Player.h:183
SpellModType type
Definition: Player.h:184
int32 value
Definition: Player.h:186
uint32 spellId
Definition: Player.h:188
Aura *const ownerAura
Definition: Player.h:189
flag96 mask
Definition: Player.h:187
SpellModList m_spellMods[MAX_SPELLMOD]
Definition: Player.h:2842

References LOG_DEBUG, m_spellMods, SpellModifier::mask, SpellModifier::op, SpellModifier::ownerAura, SendDirectMessage(), SMSG_SET_FLAT_SPELL_MODIFIER, SMSG_SET_PCT_SPELL_MODIFIER, SpellModifier::spellId, SPELLMOD_FLAT, SpellModifier::type, and SpellModifier::value.

Referenced by AuraEffect::ApplySpellMod().

◆ addTalent()

bool Player::addTalent ( uint32  spellId,
uint8  addSpecMask,
uint8  oldTalentRank 
)
2906{
2907 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2908 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, true))
2909 return false;
2910
2911 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
2912 if (!talentPos)
2913 return false;
2914
2915 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentPos->talent_id);
2916 if (!talentInfo)
2917 return false;
2918
2919 // xinef: remove old talent rank if any
2920 if (oldTalentRank)
2921 {
2922 _removeTalent(talentInfo->RankID[oldTalentRank - 1], addSpecMask);
2923 _removeTalentAurasAndSpells(talentInfo->RankID[oldTalentRank - 1]);
2924 SendLearnPacket(talentInfo->RankID[oldTalentRank - 1], false);
2925 }
2926
2927 // xinef: add talent auras and spells
2928 if (GetActiveSpecMask() & addSpecMask)
2929 _addTalentAurasAndSpells(spellId);
2930
2931 // xinef: find the spell on our talent map
2932 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2933
2934 // xinef: we do not have such a spell on our talent map
2935 if (itr == m_talents.end())
2936 {
2938 PlayerTalent* newTalent = new PlayerTalent();
2939 newTalent->State = state;
2940 newTalent->specMask = addSpecMask;
2941 newTalent->talentID = talentInfo->TalentID;
2942 newTalent->inSpellBook = talentInfo->addToSpellBook && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL);
2943 m_talents[spellId] = newTalent;
2944
2945 if (GetActiveSpecMask() & addSpecMask)
2946 m_usedTalentCount += (talentPos->rank + 1) - oldTalentRank;
2947
2948 return true;
2949 }
2950 // xinef: if current mask does not cover addMask, add it to iterator and save changes to DB
2951 else if (!(itr->second->specMask & addSpecMask))
2952 {
2953 itr->second->specMask |= addSpecMask;
2954 if (itr->second->State != PLAYERSPELL_NEW)
2955 itr->second->State = PLAYERSPELL_CHANGED;
2956
2957 if (GetActiveSpecMask() & addSpecMask)
2958 m_usedTalentCount += (talentPos->rank + 1) - oldTalentRank;
2959
2960 return true;
2961 }
2962
2963 return false;
2964}
DBCStorage< TalentEntry > sTalentStore(TalentEntryfmt)
PlayerSpellState
Definition: Player.h:118
Definition: Player.h:135
PlayerSpellState State
Definition: Player.h:136
bool inSpellBook
Definition: Player.h:139
uint32 talentID
Definition: Player.h:138
uint8 specMask
Definition: Player.h:137
Definition: DBCStructure.h:1924
std::array< uint32, MAX_TALENT_RANK > RankID
Definition: DBCStructure.h:1929
uint32 TalentID
Definition: DBCStructure.h:1925
uint32 addToSpellBook
Definition: DBCStructure.h:1935
uint16 talent_id
Definition: DBCStructure.h:2237

References _addTalentAurasAndSpells(), _removeTalent(), _removeTalentAurasAndSpells(), TalentEntry::addToSpellBook, SpellMgr::CheckSpellValid(), GetActiveSpecMask(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), PlayerTalent::inSpellBook, isBeingLoaded(), m_talents, m_usedTalentCount, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_UNCHANGED, TalentSpellPos::rank, TalentEntry::RankID, SendLearnPacket(), PlayerTalent::specMask, SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, sTalentStore, PlayerTalent::State, TalentSpellPos::talent_id, PlayerTalent::talentID, and TalentEntry::TalentID.

Referenced by _LoadTalents(), and LearnTalent().

◆ AddTimedQuest()

void Player::AddTimedQuest ( uint32  quest_id)
inline
1566{ m_timedquests.insert(quest_id); }
QuestSet m_timedquests
Definition: Player.h:2707

References m_timedquests.

Referenced by _LoadQuestStatus(), and AddQuest().

◆ AddToWorld()

void Player::AddToWorld ( )
overridevirtual
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be added when logging in

Reimplemented from WorldObject.

1708{
1713
1714 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1715 if (m_items[i])
1716 m_items[i]->AddToWorld();
1717}
@ PLAYER_SLOT_START
Definition: Player.h:670
@ PLAYER_SLOT_END
Definition: Player.h:672
void AddToWorld() override
Definition: Unit.cpp:15725

References Object::AddToWorld(), Unit::AddToWorld(), m_items, PLAYER_SLOT_END, and PLAYER_SLOT_START.

Referenced by Map::AddPlayerToMap().

◆ AddTradeableItem()

void Player::AddTradeableItem ( Item item)
4133{
4134 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4135 m_itemSoulboundTradeable.push_back(item);
4136}
std::mutex m_soulboundTradableLock
Definition: Player.h:2849
ItemDurationList m_itemSoulboundTradeable
Definition: Player.h:2848

References m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by _LoadItem(), MoveItemToInventory(), and StoreNewItem().

◆ AddWeaponProficiency()

void Player::AddWeaponProficiency ( uint32  newflag)
inline
1370{ m_WeaponProficiency |= newflag; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ AddWhisperWhiteList()

void Player::AddWhisperWhiteList ( ObjectGuid  guid)
inline
2569{ WhisperList.push_back(guid); }
WhisperListContainer WhisperList
Definition: Player.h:2661

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ AdjustQuestReqItemCount()

void Player::AdjustQuestReqItemCount ( Quest const *  quest,
QuestStatusData questStatusData 
)
private
1765{
1766 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1767 {
1768 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
1769 {
1770 uint32 reqitemcount = quest->RequiredItemCount[i];
1771 if (reqitemcount != 0)
1772 {
1773 uint32 curitemcount = GetItemCount(quest->RequiredItemId[i], true);
1774
1775 questStatusData.ItemCount[i] = std::min(curitemcount, reqitemcount);
1776 m_QuestStatusSave[quest->GetQuestId()] = true;
1777 }
1778 }
1779 }
1780}
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:327

References GetItemCount(), Quest::GetQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatusSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by AddQuest().

◆ ApplyEnchantment() [1/2]

void Player::ApplyEnchantment ( Item item,
bool  apply 
)
4299{
4300 for (uint32 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4301 ApplyEnchantment(item, EnchantmentSlot(slot), apply);
4302}

References ApplyEnchantment(), and MAX_ENCHANTMENT_SLOT.

◆ ApplyEnchantment() [2/2]

void Player::ApplyEnchantment ( Item item,
EnchantmentSlot  slot,
bool  apply,
bool  apply_dur = true,
bool  ignore_condition = false 
)
4305{
4306 if (!item || !item->IsEquipped())
4307 return;
4308
4309 if (slot >= MAX_ENCHANTMENT_SLOT)
4310 return;
4311
4312 uint32 enchant_id = item->GetEnchantmentId(slot);
4313 if (!enchant_id)
4314 return;
4315
4316 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
4317 if (!pEnchant)
4318 return;
4319
4320 if (!ignore_condition && pEnchant->EnchantmentCondition && !EnchantmentFitsRequirements(pEnchant->EnchantmentCondition, -1))
4321 return;
4322
4323 if (pEnchant->requiredLevel > GetLevel())
4324 return;
4325
4326 if (pEnchant->requiredSkill > 0 && pEnchant->requiredSkillValue > GetSkillValue(pEnchant->requiredSkill))
4327 return;
4328
4329 if (!sScriptMgr->OnPlayerCanApplyEnchantment(this, item, slot, apply, apply_dur, ignore_condition))
4330 return;
4331
4332 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4333 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4335 && !item->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4336 {
4337 // Check if the requirements for the prismatic socket are met before applying the gem stats
4339 if (!pPrismaticEnchant || (pPrismaticEnchant->requiredSkill > 0 && pPrismaticEnchant->requiredSkillValue > GetSkillValue(pPrismaticEnchant->requiredSkill)))
4340 return;
4341 }
4342
4343 if (!item->IsBroken())
4344 {
4345 for (int s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
4346 {
4347 uint32 enchant_display_type = pEnchant->type[s];
4348 uint32 enchant_amount = pEnchant->amount[s];
4349 uint32 enchant_spell_id = pEnchant->spellid[s];
4350
4351 switch (enchant_display_type)
4352 {
4354 break;
4356 // processed in Player::CastItemCombatSpell
4357 break;
4359 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4360 HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(enchant_amount), apply);
4361 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4362 HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(enchant_amount), apply);
4363 else if (item->GetSlot() == EQUIPMENT_SLOT_RANGED)
4364 HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4365 break;
4367 if (enchant_spell_id)
4368 {
4369 if (apply)
4370 {
4371 int32 basepoints = 0;
4372 // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)
4373 if (item->GetItemRandomPropertyId())
4374 {
4375 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4376 if (item_rand)
4377 {
4378 // Search enchant_amount
4379 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4380 {
4381 if (item_rand->Enchantment[k] == enchant_id)
4382 {
4383 basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4384 break;
4385 }
4386 }
4387 }
4388 }
4389 // Cast custom spell vs all equal basepoints got from enchant_amount
4390 if (basepoints)
4391 CastCustomSpell(this, enchant_spell_id, &basepoints, &basepoints, &basepoints, true, item);
4392 else
4393 CastSpell(this, enchant_spell_id, true, item);
4394 }
4395 else
4396 RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());
4397 }
4398 break;
4400 if (!enchant_amount)
4401 {
4402 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4403 if (item_rand)
4404 {
4405 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4406 {
4407 if (item_rand->Enchantment[k] == enchant_id)
4408 {
4409 enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4410 break;
4411 }
4412 }
4413 }
4414 }
4415
4416 HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + enchant_spell_id), TOTAL_VALUE, float(enchant_amount), apply);
4417 break;
4419 {
4420 if (!enchant_amount)
4421 {
4422 ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4423 if (item_rand_suffix)
4424 {
4425 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4426 {
4427 if (item_rand_suffix->Enchantment[k] == enchant_id)
4428 {
4429 enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4430 break;
4431 }
4432 }
4433 }
4434 }
4435
4436 sScriptMgr->OnPlayerApplyEnchantmentItemModsBefore(this, item, slot, apply, enchant_spell_id, enchant_amount);
4437
4438 LOG_DEBUG("entities.player.items", "Adding {} to stat nb {}", enchant_amount, enchant_spell_id);
4439 switch (enchant_spell_id)
4440 {
4441 case ITEM_MOD_MANA:
4442 LOG_DEBUG("entities.player.items", "+ {} MANA", enchant_amount);
4443 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(enchant_amount), apply);
4444 break;
4445 case ITEM_MOD_HEALTH:
4446 LOG_DEBUG("entities.player.items", "+ {} HEALTH", enchant_amount);
4447 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(enchant_amount), apply);
4448 break;
4449 case ITEM_MOD_AGILITY:
4450 LOG_DEBUG("entities.player.items", "+ {} AGILITY", enchant_amount);
4451 HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, float(enchant_amount), apply);
4452 ApplyStatBuffMod(STAT_AGILITY, (float)enchant_amount, apply);
4453 break;
4454 case ITEM_MOD_STRENGTH:
4455 LOG_DEBUG("entities.player.items", "+ {} STRENGTH", enchant_amount);
4456 HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, float(enchant_amount), apply);
4457 ApplyStatBuffMod(STAT_STRENGTH, (float)enchant_amount, apply);
4458 break;
4459 case ITEM_MOD_INTELLECT:
4460 LOG_DEBUG("entities.player.items", "+ {} INTELLECT", enchant_amount);
4461 HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply);
4462 ApplyStatBuffMod(STAT_INTELLECT, (float)enchant_amount, apply);
4463 break;
4464 case ITEM_MOD_SPIRIT:
4465 LOG_DEBUG("entities.player.items", "+ {} SPIRIT", enchant_amount);
4466 HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply);
4467 ApplyStatBuffMod(STAT_SPIRIT, (float)enchant_amount, apply);
4468 break;
4469 case ITEM_MOD_STAMINA:
4470 LOG_DEBUG("entities.player.items", "+ {} STAMINA", enchant_amount);
4471 HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply);
4472 ApplyStatBuffMod(STAT_STAMINA, (float)enchant_amount, apply);
4473 break;
4475 ApplyRatingMod(CR_DEFENSE_SKILL, enchant_amount, apply);
4476 LOG_DEBUG("entities.player.items", "+ {} DEFENCE", enchant_amount);
4477 break;
4479 ApplyRatingMod(CR_DODGE, enchant_amount, apply);
4480 LOG_DEBUG("entities.player.items", "+ {} DODGE", enchant_amount);
4481 break;
4483 ApplyRatingMod(CR_PARRY, enchant_amount, apply);
4484 LOG_DEBUG("entities.player.items", "+ {} PARRY", enchant_amount);
4485 break;
4487 ApplyRatingMod(CR_BLOCK, enchant_amount, apply);
4488 LOG_DEBUG("entities.player.items", "+ {} SHIELD_BLOCK", enchant_amount);
4489 break;
4491 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4492 LOG_DEBUG("entities.player.items", "+ {} MELEE_HIT", enchant_amount);
4493 break;
4495 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4496 LOG_DEBUG("entities.player.items", "+ {} RANGED_HIT", enchant_amount);
4497 break;
4499 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4500 LOG_DEBUG("entities.player.items", "+ {} SPELL_HIT", enchant_amount);
4501 break;
4503 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4504 LOG_DEBUG("entities.player.items", "+ {} MELEE_CRIT", enchant_amount);
4505 break;
4507 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4508 LOG_DEBUG("entities.player.items", "+ {} RANGED_CRIT", enchant_amount);
4509 break;
4511 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4512 LOG_DEBUG("entities.player.items", "+ {} SPELL_CRIT", enchant_amount);
4513 break;
4514 // Values from ITEM_STAT_MELEE_HA_RATING to ITEM_MOD_HASTE_RANGED_RATING are never used
4515 // in Enchantments
4516 // case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
4517 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4518 // break;
4519 // case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
4520 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4521 // break;
4522 // case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
4523 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4524 // break;
4525 // case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
4526 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4527 // break;
4528 // case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
4529 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4530 // break;
4531 // case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
4532 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4533 // break;
4534 // case ITEM_MOD_HASTE_MELEE_RATING:
4535 // ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4536 // break;
4538 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4539 break;
4541 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4542 break;
4544 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4545 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4546 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4547 LOG_DEBUG("entities.player.items", "+ {} HIT", enchant_amount);
4548 break;
4550 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4551 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4552 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4553 LOG_DEBUG("entities.player.items", "+ {} CRITICAL", enchant_amount);
4554 break;
4555 // Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment
4556 // case ITEM_MOD_HIT_TAKEN_RATING:
4557 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4558 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4559 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4560 // break;
4561 // case ITEM_MOD_CRIT_TAKEN_RATING:
4562 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4563 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4564 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4565 // break;
4567 ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4568 ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4569 ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4570 LOG_DEBUG("entities.player.items", "+ {} RESILIENCE", enchant_amount);
4571 break;
4573 ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4574 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4575 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4576 LOG_DEBUG("entities.player.items", "+ {} HASTE", enchant_amount);
4577 break;
4579 ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
4580 LOG_DEBUG("entities.player.items", "+ {} EXPERTISE", enchant_amount);
4581 break;
4583 HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
4584 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4585 LOG_DEBUG("entities.player.items", "+ {} ATTACK_POWER", enchant_amount);
4586 break;
4588 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4589 LOG_DEBUG("entities.player.items", "+ {} RANGED_ATTACK_POWER", enchant_amount);
4590 break;
4591 // case ITEM_MOD_FERAL_ATTACK_POWER:
4592 // ApplyFeralAPBonus(enchant_amount, apply);
4593 // LOG_DEBUG("entities.player.items", "+ {} FERAL_ATTACK_POWER", enchant_amount);
4594 // break;
4596 ApplyManaRegenBonus(enchant_amount, apply);
4597 LOG_DEBUG("entities.player.items", "+ {} MANA_REGENERATION", enchant_amount);
4598 break;
4600 ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
4601 LOG_DEBUG("entities.player.items", "+ {} ARMOR PENETRATION", enchant_amount);
4602 break;
4604 ApplySpellPowerBonus(enchant_amount, apply);
4605 LOG_DEBUG("entities.player.items", "+ {} SPELL_POWER", enchant_amount);
4606 break;
4608 ApplyHealthRegenBonus(enchant_amount, apply);
4609 LOG_DEBUG("entities.player.items", "+ {} HEALTH_REGENERATION", enchant_amount);
4610 break;
4612 ApplySpellPenetrationBonus(enchant_amount, apply);
4613 LOG_DEBUG("entities.player.items", "+ {} SPELL_PENETRATION", enchant_amount);
4614 break;
4616 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(enchant_amount), apply);
4617 LOG_DEBUG("entities.player.items", "+ {} BLOCK_VALUE", enchant_amount);
4618 break;
4619 case ITEM_MOD_SPELL_HEALING_DONE: // deprecated
4620 case ITEM_MOD_SPELL_DAMAGE_DONE: // deprecated
4621 default:
4622 break;
4623 }
4624 break;
4625 }
4626 case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
4627 {
4629 {
4630 float addValue = 0.0f;
4631 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4632 {
4633 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4635 }
4636 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4637 {
4638 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4640 }
4641 }
4642 break;
4643 }
4645 // processed in Player::CastItemUseSpell
4646 break;
4648 // nothing do..
4649 break;
4650 default:
4651 LOG_ERROR("entities.player", "Unknown item enchantment (id = {}) display type: {}", enchant_id, enchant_display_type);
4652 break;
4653 } /*switch (enchant_display_type)*/
4654 } /*for*/
4655 }
4656
4657 // visualize enchantment at player and equipped items
4658 if (slot == PERM_ENCHANTMENT_SLOT)
4659 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0);
4660
4661 if (slot == TEMP_ENCHANTMENT_SLOT)
4662 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0);
4663
4664 if (apply_dur)
4665 {
4666 if (apply)
4667 {
4668 // set duration
4669 uint32 duration = item->GetEnchantmentDuration(slot);
4670 if (duration > 0)
4671 AddEnchantmentDuration(item, slot, duration);
4672 }
4673 else
4674 {
4675 // duration == 0 will remove EnchantDuration
4676 AddEnchantmentDuration(item, slot, 0);
4677 }
4678 }
4679}
DBCStorage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore(SpellItemEnchantmentfmt)
DBCStorage< ItemRandomSuffixEntry > sItemRandomSuffixStore(ItemRandomSuffixfmt)
@ PLAYER_VISIBLE_ITEM_1_ENCHANTMENT
Definition: UpdateFields.h:287
@ UNIT_MOD_RESISTANCE_START
Definition: Unit.h:173
@ PERM_ENCHANTMENT_SLOT
Definition: Item.h:169
@ SOCK_ENCHANTMENT_SLOT_3
Definition: Item.h:173
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:170
@ SOCK_ENCHANTMENT_SLOT_2
Definition: Item.h:172
@ PRISMATIC_ENCHANTMENT_SLOT
Definition: Item.h:175
@ SOCK_ENCHANTMENT_SLOT
Definition: Item.h:171
@ ITEM_ENCHANTMENT_TYPE_DAMAGE
Definition: DBCEnums.h:368
@ ITEM_ENCHANTMENT_TYPE_USE_SPELL
Definition: DBCEnums.h:373
@ ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL
Definition: DBCEnums.h:367
@ ITEM_ENCHANTMENT_TYPE_STAT
Definition: DBCEnums.h:371
@ ITEM_ENCHANTMENT_TYPE_RESISTANCE
Definition: DBCEnums.h:370
@ ITEM_ENCHANTMENT_TYPE_NONE
Definition: DBCEnums.h:366
@ ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL
Definition: DBCEnums.h:369
@ ITEM_ENCHANTMENT_TYPE_TOTEM
Definition: DBCEnums.h:372
@ ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET
Definition: DBCEnums.h:374
#define MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS
Definition: DBCStructure.h:1839
#define MAX_ITEM_ENCHANTMENT_EFFECTS
Definition: DBCStructure.h:1205
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
int32 GetItemRandomPropertyId() const
Definition: Item.h:295
uint32 GetItemSuffixFactor() const
Definition: Item.h:296
bool IsEquipped() const
Definition: Item.cpp:789
uint32 Color
Definition: ItemTemplate.h:602
uint32 Delay
Definition: ItemTemplate.h:659
_Socket Socket[MAX_ITEM_PROTO_SOCKETS]
Definition: ItemTemplate.h:681
void SetUInt16Value(uint16 index, uint8 offset, uint16 value)
Definition: Object.cpp:770
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5458
bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot)
Definition: Player.cpp:11070
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1236
void RemoveAurasDueToItemSpell(uint32 spellId, ObjectGuid castItemGuid)
Definition: Unit.cpp:5118
Definition: DBCStructure.h:1218
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > AllocationPct
Definition: DBCStructure.h:1225
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > Enchantment
Definition: DBCStructure.h:1223
Definition: DBCStructure.h:1842
uint32 EnchantmentCondition
Definition: DBCStructure.h:1854
uint32 amount[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1846
uint32 requiredLevel
Definition: DBCStructure.h:1857
uint32 spellid[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1848
uint32 requiredSkill
Definition: DBCStructure.h:1855
uint32 requiredSkillValue
Definition: DBCStructure.h:1856
uint32 type[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1845

References AddEnchantmentDuration(), ItemRandomSuffixEntry::AllocationPct, SpellItemEnchantmentEntry::amount, ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), BASE_VALUE, Unit::CastCustomSpell(), Unit::CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_SHAMAN, _Socket::Color, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_PARRY, ItemTemplate::Delay, ItemRandomSuffixEntry::Enchantment, SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, FLAT_MOD, Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), Object::GetGUID(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), Unit::GetLevel(), GetSkillValue(), Item::GetSlot(), Item::GetTemplate(), HandleBaseModValue(), Unit::HandleStatModifier(), Item::IsBroken(), IsClass(), Item::IsEquipped(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_ENCHANTMENT_TYPE_DAMAGE, ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL, ITEM_ENCHANTMENT_TYPE_NONE, ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET, ITEM_ENCHANTMENT_TYPE_RESISTANCE, ITEM_ENCHANTMENT_TYPE_STAT, ITEM_ENCHANTMENT_TYPE_TOTEM, ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, LOG_DEBUG, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_ENCHANTMENT_EFFECTS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, PERM_ENCHANTMENT_SLOT, PLAYER_VISIBLE_ITEM_1_ENCHANTMENT, PRISMATIC_ENCHANTMENT_SLOT, Unit::RemoveAurasDueToItemSpell(), SpellItemEnchantmentEntry::requiredLevel, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, Object::SetUInt16Value(), SHIELD_BLOCK_VALUE, sItemRandomSuffixStore, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, ItemTemplate::Socket, SpellItemEnchantmentEntry::spellid, sScriptMgr, sSpellItemEnchantmentStore, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, TEMP_ENCHANTMENT_SLOT, TOTAL_VALUE, SpellItemEnchantmentEntry::type, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_START, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), ApplyEnchantment(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Spell::EffectEnchantHeldItem(), Spell::EffectEnchantItemPerm(), Spell::EffectEnchantItemPrismatic(), Spell::EffectEnchantItemTmp(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleCancelTempEnchantmentOpcode(), WorldSession::HandleSocketOpcode(), RemoveArenaEnchantments(), SetVirtualItemSlot(), SwapItem(), ToggleMetaGemsActive(), UpdateEnchantTime(), and UpdateSkillEnchantments().

◆ ApplyEquipCooldown()

void Player::ApplyEquipCooldown ( Item pItem)
11720{
11722 return;
11723
11724 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
11725 {
11726 _Spell const& spellData = pItem->GetTemplate()->Spells[i];
11727
11728 // no spell
11729 if (!spellData.SpellId)
11730 continue;
11731
11732 // xinef: apply hidden cooldown for procs
11734 {
11735 // xinef: uint32(-1) special marker for proc cooldowns
11736 AddSpellCooldown(spellData.SpellId, uint32(-1), 30 * IN_MILLISECONDS);
11737 continue;
11738 }
11739
11740 // wrong triggering type (note: ITEM_SPELLTRIGGER_ON_NO_DELAY_USE not have cooldown)
11741 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
11742 continue;
11743
11744 // xinef: dont apply equip cooldown if spell on item has insignificant cooldown
11745 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
11746 if (spellData.SpellCooldown <= 3000 && spellData.SpellCategoryCooldown <= 3000 && (!spellInfo || (spellInfo->RecoveryTime <= 3000 && spellInfo->CategoryRecoveryTime <= 3000)))
11747 continue;
11748
11749 // Don't replace longer cooldowns by equip cooldown if we have any.
11750 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellData.SpellId);
11751 if (itr != m_spellCooldowns.end() && itr->second.itemid == pItem->GetEntry() && itr->second.end > GameTime::GetGameTimeMS().count() + 30 * IN_MILLISECONDS)
11752 continue;
11753
11754 // xinef: dont apply eqiup cooldown for spells with this attribute
11755 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL))
11756 continue;
11757
11758 AddSpellCooldown(spellData.SpellId, pItem->GetEntry(), 30 * IN_MILLISECONDS, true, true);
11759
11761 data << pItem->GetGUID();
11762 data << uint32(spellData.SpellId);
11763 GetSession()->SendPacket(&data);
11764 }
11765}
@ ITEM_SPELLTRIGGER_ON_USE
Definition: ItemTemplate.h:77
@ ITEM_SPELLTRIGGER_ON_EQUIP
Definition: ItemTemplate.h:78
@ ITEM_FLAG_NO_EQUIP_COOLDOWN
Definition: ItemTemplate.h:154
#define MAX_ITEM_PROTO_SPELLS
Definition: ItemTemplate.h:615
@ SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL
Definition: SharedDefines.h:410
@ SMSG_ITEM_COOLDOWN
Definition: Opcodes.h:206
Definition: ItemTemplate.h:590
uint32 SpellTrigger
Definition: ItemTemplate.h:592
int32 SpellCategoryCooldown
Definition: ItemTemplate.h:597
int32 SpellCooldown
Definition: ItemTemplate.h:595
int32 SpellId
Definition: ItemTemplate.h:591
_Spell Spells[MAX_ITEM_PROTO_SPELLS]
Definition: ItemTemplate.h:662
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:11036
uint32 RecoveryTime
Definition: SpellInfo.h:348
uint32 CategoryRecoveryTime
Definition: SpellInfo.h:349

References AddSpellCooldown(), SpellInfo::CategoryRecoveryTime, Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetSession(), Item::GetTemplate(), SpellInfo::HasAttribute(), ItemTemplate::HasFlag(), IN_MILLISECONDS, ITEM_FLAG_NO_EQUIP_COOLDOWN, ITEM_SPELLTRIGGER_ON_EQUIP, ITEM_SPELLTRIGGER_ON_USE, m_spellCooldowns, MAX_ITEM_PROTO_SPELLS, SpellInfo::RecoveryTime, WorldSession::SendPacket(), SMSG_ITEM_COOLDOWN, SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL, _Spell::SpellCategoryCooldown, _Spell::SpellCooldown, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, and sSpellMgr.

Referenced by EquipItem().

◆ ApplyEquipSpell()

void Player::ApplyEquipSpell ( SpellInfo const *  spellInfo,
Item item,
bool  apply,
bool  form_change = false 
)
7160{
7161 if (apply)
7162 {
7163 if (!sScriptMgr->OnPlayerCanApplyEquipSpell(this, spellInfo, item, apply, form_change))
7164 return;
7165
7166 // Cannot be used in this stance/form
7167 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) != SPELL_CAST_OK)
7168 return;
7169
7170 if (form_change) // check aura active state from other form
7171 {
7172 AuraApplicationMapBounds range = GetAppliedAuras().equal_range(spellInfo->Id);
7173 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
7174 if (!item || itr->second->GetBase()->GetCastItemGUID() == item->GetGUID())
7175 return;
7176 }
7177
7178 LOG_DEBUG("entities.player", "WORLD: cast {} Equip spellId - {}", (item ? "item" : "itemset"), spellInfo->Id);
7179
7180 //Ignore spellInfo->DurationEntry, cast with -1 duration
7181 CastCustomSpell(spellInfo->Id, SPELLVALUE_AURA_DURATION, -1, this, true, item);
7182 }
7183 else
7184 {
7185 if (form_change) // check aura compatibility
7186 {
7187 // Cannot be used in this stance/form
7188 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) == SPELL_CAST_OK)
7189 return; // and remove only not compatible at form change
7190 }
7191
7192 if (item)
7193 RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID()); // un-apply all spells, not only at-equipped
7194 else
7195 RemoveAurasDueToSpell(spellInfo->Id); // un-apply spell (item set case)
7196 }
7197}
@ SPELLVALUE_AURA_DURATION
Definition: SpellDefines.h:119
@ SPELL_CAST_OK
Definition: SharedDefines.h:1138
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:1861
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:630
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1304

References Unit::CastCustomSpell(), SpellInfo::CheckShapeshift(), Unit::GetAppliedAuras(), Object::GetGUID(), Unit::GetShapeshiftForm(), SpellInfo::Id, LOG_DEBUG, Unit::RemoveAurasDueToItemSpell(), Unit::RemoveAurasDueToSpell(), SPELL_CAST_OK, SPELLVALUE_AURA_DURATION, and sScriptMgr.

Referenced by AddItemsSetItem(), ApplyItemEquipSpell(), RemoveItemsSetItem(), and UpdateEquipSpellsAtFormChange().

◆ ApplyFeralAPBonus()

void Player::ApplyFeralAPBonus ( int32  amount,
bool  apply 
)
325{
326 _ModifyUInt32(apply, m_baseFeralAP, amount);
328}
bool _ModifyUInt32(bool apply, uint32 &baseValue, int32 &amount)
Definition: StatSystem.cpp:28
void UpdateAttackPowerAndDamage(bool ranged=false) override
Definition: StatSystem.cpp:330

References _ModifyUInt32(), m_baseFeralAP, and UpdateAttackPowerAndDamage().

Referenced by _ApplyItemBonuses().

◆ ApplyHealthRegenBonus()

void Player::ApplyHealthRegenBonus ( int32  amount,
bool  apply 
)
922{
923 _ModifyUInt32(apply, m_baseHealthRegen, amount);
924}

References _ModifyUInt32(), and m_baseHealthRegen.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyItemEquipSpell()

void Player::ApplyItemEquipSpell ( Item item,
bool  apply,
bool  form_change = false 
)
7120{
7121 if (!item)
7122 return;
7123
7124 ItemTemplate const* proto = item->GetTemplate();
7125 if (!proto)
7126 return;
7127
7128 for (auto const& spellData : proto->Spells)
7129 {
7130 // no spell
7131 if (!spellData.SpellId)
7132 continue;
7133
7134 // wrong triggering type
7135 if (apply)
7136 {
7137 // Only apply "On Equip" spells
7138 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
7139 continue;
7140 }
7141 else
7142 {
7143 // Do not remove "Use" spells in these special cases:
7144 // 1. During form changes (e.g., druid shapeshifting)
7145 // 2. When the spell comes from an item with negative charges, which means its effect should persist after the item is consumed or removed.
7146 if (spellData.SpellTrigger == ITEM_SPELLTRIGGER_ON_USE && (form_change || spellData.SpellCharges < 0))
7147 continue;
7148 }
7149
7150 // check if it is valid spell
7151 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(spellData.SpellId);
7152 if (!spellproto)
7153 continue;
7154
7155 ApplyEquipSpell(spellproto, item, apply, form_change);
7156 }
7157}
void ApplyEquipSpell(SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
Definition: Player.cpp:7159

References ApplyEquipSpell(), Item::GetTemplate(), ITEM_SPELLTRIGGER_ON_EQUIP, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::Spells, and sSpellMgr.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and UpdateEquipSpellsAtFormChange().

◆ ApplyManaRegenBonus()

void Player::ApplyManaRegenBonus ( int32  amount,
bool  apply 
)
916{
917 _ModifyUInt32(apply, m_baseManaRegen, amount);
919}
void UpdateManaRegen()
Definition: StatSystem.cpp:926

References _ModifyUInt32(), m_baseManaRegen, and UpdateManaRegen().

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyRatingMod()

void Player::ApplyRatingMod ( CombatRating  cr,
int32  value,
bool  apply 
)
5268{
5269 float oldRating = m_baseRatingValue[cr];
5270 m_baseRatingValue[cr] += (apply ? value : -value);
5271 // explicit affected values
5272 if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL)
5273 {
5274 float const mult = GetRatingMultiplier(cr);
5275 float const oldVal = oldRating * mult;
5276 float const newVal = m_baseRatingValue[cr] * mult;
5277 switch (cr)
5278 {
5279 case CR_HASTE_MELEE:
5280 ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false);
5281 ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false);
5284 break;
5285 case CR_HASTE_RANGED:
5288 break;
5289 case CR_HASTE_SPELL:
5290 ApplyCastTimePercentMod(oldVal, false);
5291 ApplyCastTimePercentMod(newVal, true);
5292 break;
5293 default:
5294 break;
5295 }
5296 }
5297
5298 UpdateRating(cr);
5299}
float GetRatingMultiplier(CombatRating cr) const
Definition: Player.cpp:5190
void UpdateRating(CombatRating cr)
Definition: PlayerUpdates.cpp:610
void ApplyAttackTimePercentMod(WeaponAttackType att, float val, bool apply)
Definition: Unit.cpp:17087
void ApplyCastTimePercentMod(float val, bool apply)
Definition: Unit.cpp:17103

References Unit::ApplyAttackTimePercentMod(), Unit::ApplyCastTimePercentMod(), BASE_ATTACK, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, GetRatingMultiplier(), m_baseRatingValue, OFF_ATTACK, RANGED_ATTACK, and UpdateRating().

Referenced by _ApplyItemBonuses(), ApplyEnchantment(), AuraEffect::HandleModRating(), AuraEffect::HandleModRatingFromStat(), RecalculateRating(), and UpdateStats().

◆ ApplySpellMod()

template<class T >
template AC_GAME_API void Player::ApplySpellMod ( uint32  spellId,
SpellModOp  op,
T &  basevalue,
Spell spell = nullptr,
bool  temporaryPet = false 
)
9742{
9743 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9744 if (!spellInfo)
9745 return;
9746
9747 float totalmul = 1.0f;
9748 int32 totalflat = 0;
9749
9750 auto calculateSpellMod = [&](SpellModifier* mod)
9751 {
9752 // xinef: temporary pets cannot use charged mods of owner, needed for mirror image QQ they should use their own auras
9753 if (temporaryPet && mod->charges != 0)
9754 return;
9755
9756 // skip if already instant or cost is free
9757 if (mod->op == SPELLMOD_CASTING_TIME || mod->op == SPELLMOD_COST)
9758 if (((float)basevalue + (float)basevalue * (totalmul - 1.0f) + (float)totalflat) <= 0)
9759 return;
9760
9761 if (mod->type == SPELLMOD_FLAT)
9762 {
9763 // xinef: do not allow to consume more than one 100% crit increasing spell
9764 if (mod->op == SPELLMOD_CRITICAL_CHANCE && totalflat >= 100)
9765 return;
9766
9767 int32 flatValue = mod->value;
9768
9769 // SPELL_MOD_THREAT - divide by 100 (in packets we send threat * 100)
9770 if (mod->op == SPELLMOD_THREAT)
9771 flatValue /= 100;
9772
9773 totalflat += flatValue;
9774 }
9775 else if (mod->type == SPELLMOD_PCT)
9776 {
9777 // skip percent mods for null basevalue (most important for spell mods with charges)
9778 if (basevalue == T(0) || totalmul == 0.0f)
9779 return;
9780
9781 // special case (skip > 10sec spell casts for instant cast setting)
9782 if (mod->op == SPELLMOD_CASTING_TIME && basevalue >= T(10000) && mod->value <= -100)
9783 return;
9784 // xinef: special exception for surge of light, dont affect crit chance if previous mods were not applied
9785 else if (mod->op == SPELLMOD_CRITICAL_CHANCE && spell && !HasSpellMod(mod, spell))
9786 return;
9787 // xinef: special case for backdraft gcd reduce with backlast time reduction, dont affect gcd if cast time was not applied
9788 else if (mod->op == SPELLMOD_GLOBAL_COOLDOWN && spell && !HasSpellMod(mod, spell))
9789 return;
9790
9791 // xinef: those two mods should be multiplicative (Glyph of Renew)
9792 if (mod->op == SPELLMOD_DAMAGE || mod->op == SPELLMOD_DOT)
9793 totalmul *= CalculatePct(1.0f, 100.0f + mod->value);
9794 else
9795 totalmul += CalculatePct(1.0f, mod->value);
9796 }
9797
9798 DropModCharge(mod, spell);
9799 };
9800
9801 // Drop charges for triggering spells instead of triggered ones
9803 spell = m_spellModTakingSpell;
9804
9805 for (auto mod : m_spellMods[op])
9806 {
9807 // Charges can be set only for mods with auras
9808 if (!mod->ownerAura)
9809 ASSERT(!mod->charges);
9810
9811 if (!IsAffectedBySpellmod(spellInfo, mod, spell))
9812 continue;
9813
9814 calculateSpellMod(mod);
9815 }
9816
9817 if (op == SPELLMOD_CASTING_TIME || op == SPELLMOD_DURATION)
9818 basevalue = (basevalue + totalflat) > 0 ? (basevalue + totalflat) * totalmul : 0;
9819 else
9820 basevalue = (basevalue * totalmul) + totalflat;
9821}
@ SPELLMOD_PCT
Definition: Player.h:94
@ SPELLMOD_DAMAGE
Definition: SpellDefines.h:76
@ SPELLMOD_DOT
Definition: SpellDefines.h:98
@ SPELLMOD_CRITICAL_CHANCE
Definition: SpellDefines.h:83
@ SPELLMOD_GLOBAL_COOLDOWN
Definition: SpellDefines.h:97
@ SPELLMOD_THREAT
Definition: SpellDefines.h:78
@ SPELLMOD_DURATION
Definition: SpellDefines.h:77
@ SPELLMOD_CASTING_TIME
Definition: SpellDefines.h:86
@ SPELLMOD_COST
Definition: SpellDefines.h:90
T CalculatePct(T base, U pct)
Definition: Util.h:61
Definition: Player.h:181
void DropModCharge(SpellModifier *mod, Spell *spell)
Definition: Player.cpp:10014
bool HasSpellMod(SpellModifier *mod, Spell *spell)
Definition: Player.cpp:9716
bool IsAffectedBySpellmod(SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
Definition: Player.cpp:9724

References ASSERT, CalculatePct(), DropModCharge(), HasSpellMod(), IsAffectedBySpellmod(), m_spellMods, m_spellModTakingSpell, SPELLMOD_CASTING_TIME, SPELLMOD_COST, SPELLMOD_CRITICAL_CHANCE, SPELLMOD_DAMAGE, SPELLMOD_DOT, SPELLMOD_DURATION, SPELLMOD_FLAT, SPELLMOD_GLOBAL_COOLDOWN, SPELLMOD_PCT, SPELLMOD_THREAT, and sSpellMgr.

Referenced by AddSpellAndCategoryCooldowns(), Aura::CalcMaxDuration(), AuraEffect::CalculatePeriodic(), CastItemCombatSpell(), Spell::Delayed(), Spell::DelayedChannel(), and Spell::TriggerGlobalCooldown().

◆ ApplySpellPenetrationBonus()

void Player::ApplySpellPenetrationBonus ( int32  amount,
bool  apply 
)
220{
222 m_spellPenetrationItemMod += apply ? amount : -amount;
223}
@ PLAYER_FIELD_MOD_TARGET_RESISTANCE
Definition: UpdateFields.h:366
void ApplyModInt32Value(uint16 index, int32 val, bool apply)
Definition: Object.cpp:815

References Object::ApplyModInt32Value(), m_spellPenetrationItemMod, and PLAYER_FIELD_MOD_TARGET_RESISTANCE.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplySpellPowerBonus()

void Player::ApplySpellPowerBonus ( int32  amount,
bool  apply 
)
168{
169 apply = _ModifyUInt32(apply, m_baseSpellPower, amount);
170
171 // For speed just update for client
173 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
175}
@ PLAYER_FIELD_MOD_HEALING_DONE_POS
Definition: UpdateFields.h:363
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:284

References _ModifyUInt32(), Object::ApplyModInt32Value(), Object::ApplyModUInt32Value(), m_baseSpellPower, MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, and SPELL_SCHOOL_HOLY.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ AreaExploredOrEventHappens()

void Player::AreaExploredOrEventHappens ( uint32  questId)
1792{
1793 if (questId)
1794 {
1795 uint16 log_slot = FindQuestSlot(questId);
1796 QuestStatusData* q_status = nullptr;
1797 if (log_slot < MAX_QUEST_LOG_SIZE)
1798 {
1799 q_status = &m_QuestStatus[questId];
1800
1801 // xinef: added failed check
1802 if (!q_status->Explored && q_status->Status != QUEST_STATUS_FAILED)
1803 {
1804 q_status->Explored = true;
1805 m_QuestStatusSave[questId] = true;
1806
1807 SendQuestComplete(questId);
1808 }
1809 }
1810 if (CanCompleteQuest(questId, q_status))
1811 CompleteQuest(questId);
1812 else
1814 }
1815}
@ ADDITIONAL_SAVING_QUEST_STATUS
Definition: Player.h:999
void SendQuestComplete(uint32 quest_id)
Definition: PlayerQuest.cpp:2346
void AdditionalSavingAddMask(uint8 mask)
Definition: Player.h:2584

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::Explored, FindQuestSlot(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_STATUS_FAILED, SendQuestComplete(), and QuestStatusData::Status.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), Spell::EffectQuestComplete(), SmartAI::EndPath(), dragonmaw_race_npc::FinishRace(), go_ahune_ice_stone::GossipSelect(), GroupEventHappens(), WorldSession::HandleAreaTriggerOpcode(), boss_alar::JustDied(), go_table_theka::OnGossipHello(), npc_parqual_fintallas::OnGossipSelect(), npc_great_bear_spirit::OnGossipSelect(), npc_thrall_warchief::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_stone_watcher_of_norgannon::OnGossipSelect(), npc_vekjik::OnGossipSelect(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), npc_doctor::npc_doctorAI::PatientSaved(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), and npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI().

◆ AutoStoreLoot() [1/2]

void Player::AutoStoreLoot ( uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
inline
1326{ AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); }
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
Definition: Player.cpp:13434

References AutoStoreLoot(), NULL_BAG, and NULL_SLOT.

Referenced by AutoStoreLoot().

◆ AutoStoreLoot() [2/2]

void Player::AutoStoreLoot ( uint8  bag,
uint8  slot,
uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
13435{
13436 Loot loot;
13437 loot.FillLoot (loot_id, store, this, true);
13438
13439 uint32 max_slot = loot.GetMaxSlotInLootFor(this);
13440 for (uint32 i = 0; i < max_slot; ++i)
13441 {
13442 LootItem* lootItem = loot.LootItemInSlot(i, this);
13443
13444 ItemPosCountVec dest;
13445 InventoryResult msg = CanStoreNewItem(bag, slot, dest, lootItem->itemid, lootItem->count);
13446 if (msg != EQUIP_ERR_OK && slot != NULL_SLOT)
13447 msg = CanStoreNewItem(bag, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13448 if (msg != EQUIP_ERR_OK && bag != NULL_BAG)
13449 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13450 if (msg != EQUIP_ERR_OK)
13451 {
13452 SendEquipError(msg, nullptr, nullptr, lootItem->itemid);
13453 continue;
13454 }
13455
13456 Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomPropertyId);
13457 SendNewItem(pItem, lootItem->count, false, false, broadcast);
13458 }
13459}
Definition: LootMgr.h:154
uint32 itemid
Definition: LootMgr.h:155
int32 randomPropertyId
Definition: LootMgr.h:158
uint8 count
Definition: LootMgr.h:162
Definition: LootMgr.h:313
uint32 GetMaxSlotInLootFor(Player *player) const
Definition: LootMgr.cpp:915
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition: LootMgr.cpp:850
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:570

References CanStoreNewItem(), LootItem::count, EQUIP_ERR_OK, Loot::FillLoot(), Loot::GetMaxSlotInLootFor(), LootItem::itemid, Loot::LootItemInSlot(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by Group::CountTheRoll(), Spell::EffectCreateItem2(), Spell::EffectCreateRandomItem(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ AutoUnequipOffhandIfNeed()

void Player::AutoUnequipOffhandIfNeed ( bool  force = false)
12412{
12414 if (!offItem)
12415 {
12417 return;
12418 }
12419
12420 // unequip offhand weapon if player doesn't have dual wield anymore
12422 force = true;
12423
12424 // unequip offhand weapon if player main hand weapon is a polearm or staff or fishing pole
12426 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
12427 if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM ||
12428 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF ||
12429 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_FISHING_POLE)
12430 force = true;
12431
12432 // need unequip offhand for 2h-weapon without TitanGrip (in any from hands)
12433 if (!force && (CanTitanGrip() || (offItem->GetTemplate()->InventoryType != INVTYPE_2HWEAPON && !IsTwoHandUsed())))
12434 {
12436 return;
12437 }
12438
12439 ItemPosCountVec off_dest;
12440 uint8 off_msg = CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false);
12441 if (off_msg == EQUIP_ERR_OK)
12442 {
12444 StoreItem(off_dest, offItem, true);
12445 }
12446 else
12447 {
12449 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
12450 offItem->DeleteFromInventoryDB(trans); // deletes item from character's inventory
12451 offItem->SaveToDB(trans); // recursive and not have transaction guard into self, item not in inventory and can be save standalone
12452
12453 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
12454 MailDraft(subject, "There were problems with equipping one or several items").AddItem(offItem).SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
12455
12456 CharacterDatabase.CommitTransaction(trans);
12457 }
12459}
@ ITEM_SUBCLASS_WEAPON_STAFF
Definition: ItemTemplate.h:354
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
Definition: ItemTemplate.h:364
@ ITEM_SUBCLASS_WEAPON_POLEARM
Definition: ItemTemplate.h:350
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:269
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:273
uint32 InventoryType
Definition: ItemTemplate.h:632
bool CanTitanGrip() const
Definition: Player.h:2197
bool IsTwoHandUsed() const
Definition: Player.h:1375
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
Definition: PlayerStorage.cpp:2978
void RemoveItem(uint8 bag, uint8 slot, bool update, bool swap=false)
Definition: PlayerStorage.cpp:2899
void UpdateTitansGrip()
Definition: PlayerUpdates.cpp:1844
bool CanDualWield() const
Definition: Unit.h:916
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition: Mail.cpp:185
MailDraft & AddItem(Item *item)
Definition: Mail.cpp:93

References MailDraft::AddItem(), Unit::CanDualWield(), CanStoreItem(), CanTitanGrip(), CharacterDatabase, Item::DeleteFromInventoryDB(), EQUIP_ERR_OK, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, WorldSession::GetAcoreString(), GetItemByPos(), GetSession(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, IsTwoHandUsed(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, LANG_NOT_EQUIPPED_ITEM, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MoveItemFromInventory(), NULL_BAG, NULL_SLOT, RemoveItem(), Item::SaveToDB(), MailDraft::SendMailTo(), StoreItem(), and UpdateTitansGrip().

Referenced by _StoreOrEquipNewItem(), ActivateSpec(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), resetTalents(), SplitItem(), StoreNewItemInBestSlots(), SwapItem(), and UpdateZone().

◆ BankItem() [1/2]

Item * Player::BankItem ( ItemPosCountVec const &  dest,
Item pItem,
bool  update 
)
inline

◆ BankItem() [2/2]

Item * Player::BankItem ( uint16  pos,
Item pItem,
bool  update 
)

◆ BindToInstance()

void Player::BindToInstance ( )
6509{
6510 InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(_pendingBindId);
6511 if (!mapSave) //it seems sometimes mapSave is nullptr, but I did not check why
6512 return;
6513
6515 data << uint32(0);
6516 GetSession()->SendPacket(&data);
6517 sInstanceSaveMgr->PlayerBindToInstance(this->GetGUID(), mapSave, true, this);
6518}
#define sInstanceSaveMgr
Definition: InstanceSaveMgr.h:202
@ SMSG_INSTANCE_SAVE_CREATED
Definition: Opcodes.h:745
uint32 _pendingBindId
Definition: Player.h:3001
Definition: InstanceSaveMgr.h:56

References _pendingBindId, Object::GetGUID(), GetSession(), WorldSession::SendPacket(), sInstanceSaveMgr, and SMSG_INSTANCE_SAVE_CREATED.

Referenced by WorldSession::HandleInstanceLockResponse(), and Update().

◆ BuildCreateUpdateBlockForPlayer()

void Player::BuildCreateUpdateBlockForPlayer ( UpdateData data,
Player target 
)
overridevirtual

Reimplemented from Object.

3818{
3819 if (target == this)
3820 {
3821 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
3822 {
3823 if (!m_items[i])
3824 continue;
3825
3826 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3827 }
3828
3830 {
3831 if (!m_items[i])
3832 continue;
3833
3834 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3835 }
3837 {
3838 if (!m_items[i])
3839 continue;
3840
3841 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3842 }
3843 }
3844
3846}
@ KEYRING_SLOT_START
Definition: Player.h:736
@ BANK_SLOT_BAG_END
Definition: Player.h:724
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:189

References BANK_SLOT_BAG_END, Object::BuildCreateUpdateBlockForPlayer(), CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

Referenced by Map::SendInitSelf().

◆ BuildEnchantmentsInfoData()

void Player::BuildEnchantmentsInfoData ( WorldPacket data)
14376{
14377 uint32 slotUsedMask = 0;
14378 std::size_t slotUsedMaskPos = data->wpos();
14379 *data << uint32(slotUsedMask); // slotUsedMask < 0x80000
14380
14381 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14382 {
14384
14385 if (!item)
14386 continue;
14387
14388 slotUsedMask |= (1 << i);
14389
14390 *data << uint32(item->GetEntry()); // item entry
14391
14392 uint16 enchantmentMask = 0;
14393 std::size_t enchantmentMaskPos = data->wpos();
14394 *data << uint16(enchantmentMask); // enchantmentMask < 0x1000
14395
14396 for (uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
14397 {
14398 uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
14399
14400 if (!enchId)
14401 continue;
14402
14403 enchantmentMask |= (1 << j);
14404
14405 *data << uint16(enchId); // enchantmentId?
14406 }
14407
14408 data->put<uint16>(enchantmentMaskPos, enchantmentMask);
14409
14410 *data << int16(item->GetItemRandomPropertyId()); // item random property id
14411 *data << item->GetGuidValue(ITEM_FIELD_CREATOR).WriteAsPacked(); // item creator
14412 *data << uint32(item->GetItemSuffixFactor()); // item suffix factor
14413 }
14414
14415 data->put<uint32>(slotUsedMaskPos, slotUsedMask);
14416}
@ ITEM_FIELD_CREATOR
Definition: UpdateFields.h:37
ObjectGuid GetGuidValue(uint16 index) const
Definition: Object.cpp:337
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:316
std::size_t wpos() const
Definition: ByteBuffer.h:330
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:137

References EQUIPMENT_SLOT_END, Item::GetEnchantmentId(), Object::GetEntry(), Object::GetGuidValue(), GetItemByPos(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), INVENTORY_SLOT_BAG_0, ITEM_FIELD_CREATOR, MAX_ENCHANTMENT_SLOT, ByteBuffer::put(), ByteBuffer::wpos(), and ObjectGuid::WriteAsPacked().

Referenced by WorldSession::HandleInspectOpcode().

◆ BuildEnumData()

bool Player::BuildEnumData ( PreparedQueryResult  result,
WorldPacket data 
)
static
1096{
1097 // 0 1 2 3 4 5 6 7
1098 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle,
1099 // 8 9 10 11 12 13 14 15
1100 // characters.hairColor, characters.facialStyle, character.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z,
1101 // 16 17 18 19 20 21 22 23
1102 // guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, character_banned.guid,
1103 // 24 25
1104 // characters.extra_flags, character_declinedname.genitive
1105
1106 Field* fields = result->Fetch();
1107
1108 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1109 uint8 plrRace = fields[2].Get<uint8>();
1110 uint8 plrClass = fields[3].Get<uint8>();
1111 uint8 gender = fields[4].Get<uint8>();
1112
1113 ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(guidLow);
1114
1115 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(plrRace, plrClass);
1116 if (!info)
1117 {
1118 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Don't build enum.", guid.ToString());
1119 return false;
1120 }
1121 else if (!IsValidGender(gender))
1122 {
1123 LOG_ERROR("entities.player", "Player ({}) has incorrect gender ({}), don't build enum.", guid.ToString(), gender);
1124 return false;
1125 }
1126
1127 *data << guid;
1128 *data << fields[1].Get<std::string>(); // name
1129 *data << uint8(plrRace); // race
1130 *data << uint8(plrClass); // class
1131 *data << uint8(gender); // gender
1132
1133 uint8 skin = fields[5].Get<uint8>();
1134 uint8 face = fields[6].Get<uint8>();
1135 uint8 hairStyle = fields[7].Get<uint8>();
1136 uint8 hairColor = fields[8].Get<uint8>();
1137 uint8 facialStyle = fields[9].Get<uint8>();
1138
1139 uint32 charFlags = 0;
1140 uint32 playerFlags = fields[17].Get<uint32>();
1141 uint16 atLoginFlags = fields[18].Get<uint16>();
1142 uint32 zone = (atLoginFlags & AT_LOGIN_FIRST) != 0 ? 0 : fields[11].Get<uint16>(); // if first login do not show the zone
1143
1144 *data << uint8(skin);
1145 *data << uint8(face);
1146 *data << uint8(hairStyle);
1147 *data << uint8(hairColor);
1148 *data << uint8(facialStyle);
1149
1150 *data << uint8(fields[10].Get<uint8>()); // level
1151 *data << uint32(zone); // zone
1152 *data << uint32(fields[12].Get<uint16>()); // map
1153
1154 *data << fields[13].Get<float>(); // x
1155 *data << fields[14].Get<float>(); // y
1156 *data << fields[15].Get<float>(); // z
1157
1158 *data << uint32(fields[16].Get<uint32>()); // guild id
1159
1160 if (atLoginFlags & AT_LOGIN_RESURRECT)
1161 playerFlags &= ~PLAYER_FLAGS_GHOST;
1162 if (playerFlags & PLAYER_FLAGS_HIDE_HELM)
1163 charFlags |= CHARACTER_FLAG_HIDE_HELM;
1164 if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK)
1165 charFlags |= CHARACTER_FLAG_HIDE_CLOAK;
1166 if (playerFlags & PLAYER_FLAGS_GHOST)
1167 charFlags |= CHARACTER_FLAG_GHOST;
1168 if (atLoginFlags & AT_LOGIN_RENAME)
1169 charFlags |= CHARACTER_FLAG_RENAME;
1170 if (fields[23].Get<uint32>())
1172 if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
1173 {
1174 if (!fields[25].Get<std::string>().empty())
1175 charFlags |= CHARACTER_FLAG_DECLINED;
1176 }
1177 else
1178 charFlags |= CHARACTER_FLAG_DECLINED;
1179
1180 *data << uint32(charFlags); // character flags
1181
1182 // character customize flags
1183 if (atLoginFlags & AT_LOGIN_CUSTOMIZE)
1185 else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION)
1187 else if (atLoginFlags & AT_LOGIN_CHANGE_RACE)
1189 else
1191
1192 // First login
1193 *data << uint8(atLoginFlags & AT_LOGIN_FIRST ? 1 : 0);
1194
1195 // Pets info
1196 uint32 petDisplayId = 0;
1197 uint32 petLevel = 0;
1198 uint32 petFamily = 0;
1199
1200 // show pet at selection character in character list only for non-ghost character
1201 if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (plrClass == CLASS_WARLOCK || plrClass == CLASS_HUNTER || (plrClass == CLASS_DEATH_KNIGHT && (fields[21].Get<uint32>()&PLAYER_EXTRA_SHOW_DK_PET))))
1202 {
1203 uint32 entry = fields[19].Get<uint32>();
1204 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry);
1205 if (creatureInfo)
1206 {
1207 petDisplayId = fields[20].Get<uint32>();
1208 petLevel = fields[21].Get<uint16>();
1209 petFamily = creatureInfo->family;
1210 }
1211 }
1212
1213 *data << uint32(petDisplayId);
1214 *data << uint32(petLevel);
1215 *data << uint32(petFamily);
1216
1217 std::vector<std::string_view> equipment = Acore::Tokenize(fields[22].Get<std::string_view>(), ' ', false);
1218 for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot)
1219 {
1220 uint32 const visualBase = slot * 2;
1221 Optional<uint32> itemId;
1222
1223 if (visualBase < equipment.size())
1224 {
1225 itemId = Acore::StringTo<uint32>(equipment[visualBase]);
1226 }
1227
1228 ItemTemplate const* proto = nullptr;
1229 if (itemId)
1230 {
1231 proto = sObjectMgr->GetItemTemplate(*itemId);
1232 }
1233
1234 if (!proto)
1235 {
1236 if (!itemId || *itemId)
1237 {
1238 LOG_WARN("entities.player.loading", "Player {} has invalid equipment '{}' in `equipmentcache` at index {}. Skipped.",
1239 guid.ToString(), (visualBase < equipment.size()) ? equipment[visualBase] : "<none>", visualBase);
1240 }
1241
1242 *data << uint32(0);
1243 *data << uint8(0);
1244 *data << uint32(0);
1245
1246 continue;
1247 }
1248
1249 SpellItemEnchantmentEntry const* enchant = nullptr;
1250
1251 Optional<uint32> enchants = {};
1252 if ((visualBase + 1) < equipment.size())
1253 {
1254 enchants = Acore::StringTo<uint32>(equipment[visualBase + 1]);
1255 }
1256
1257 if (!enchants)
1258 {
1259 LOG_WARN("entities.player.loading", "Player {} has invalid enchantment info '{}' in `equipmentcache` at index {}. Skipped.",
1260 guid.ToString(), ((visualBase + 1) < equipment.size()) ? equipment[visualBase + 1] : "<none>", visualBase + 1);
1261
1262 enchants = 0;
1263 }
1264
1265 for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot)
1266 {
1267 // values stored in 2 uint16
1268 uint32 enchantId = 0x0000FFFF & ((*enchants) >> enchantSlot * 16);
1269 if (!enchantId)
1270 {
1271 continue;
1272 }
1273
1274 enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId);
1275 if (enchant)
1276 {
1277 break;
1278 }
1279 }
1280
1281 *data << uint32(proto->DisplayInfoID);
1282 *data << uint8(proto->InventoryType);
1283 *data << uint32(enchant ? enchant->aura_id : 0);
1284 }
1285
1286 return true;
1287}
@ PLAYER_EXTRA_SHOW_DK_PET
Definition: Player.h:599
@ PLAYER_FLAGS_HIDE_CLOAK
Definition: Player.h:491
@ PLAYER_FLAGS_GHOST
Definition: Player.h:484
@ PLAYER_FLAGS_HIDE_HELM
Definition: Player.h:490
@ AT_LOGIN_FIRST
Definition: Player.h:611
@ AT_LOGIN_RESURRECT
Definition: Player.h:617
@ AT_LOGIN_CUSTOMIZE
Definition: Player.h:609
@ AT_LOGIN_RENAME
Definition: Player.h:606
@ AT_LOGIN_CHANGE_RACE
Definition: Player.h:613
@ AT_LOGIN_CHANGE_FACTION
Definition: Player.h:612
@ CHAR_CUSTOMIZE_FLAG_RACE
Definition: Player.cpp:142
@ CHAR_CUSTOMIZE_FLAG_NONE
Definition: Player.cpp:139
@ CHAR_CUSTOMIZE_FLAG_FACTION
Definition: Player.cpp:141
@ CHAR_CUSTOMIZE_FLAG_CUSTOMIZE
Definition: Player.cpp:140
@ CHARACTER_FLAG_GHOST
Definition: Player.cpp:116
@ CHARACTER_FLAG_DECLINED
Definition: Player.cpp:128
@ CHARACTER_FLAG_HIDE_HELM
Definition: Player.cpp:113
@ CHARACTER_FLAG_HIDE_CLOAK
Definition: Player.cpp:114
@ CHARACTER_FLAG_LOCKED_BY_BILLING
Definition: Player.cpp:127
@ CHARACTER_FLAG_RENAME
Definition: Player.cpp:117
@ CONFIG_DECLINED_NAMES_USED
Definition: IWorld.h:106
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
Definition: CreatureData.h:186
uint32 DisplayInfoID
Definition: ItemTemplate.h:625
static bool IsValidGender(uint8 Gender)
Definition: Player.h:1582
uint32 aura_id
Definition: DBCStructure.h:1851

References AT_LOGIN_CHANGE_FACTION, AT_LOGIN_CHANGE_RACE, AT_LOGIN_CUSTOMIZE, AT_LOGIN_FIRST, AT_LOGIN_RENAME, AT_LOGIN_RESURRECT, SpellItemEnchantmentEntry::aura_id, CHAR_CUSTOMIZE_FLAG_CUSTOMIZE, CHAR_CUSTOMIZE_FLAG_FACTION, CHAR_CUSTOMIZE_FLAG_NONE, CHAR_CUSTOMIZE_FLAG_RACE, CHARACTER_FLAG_DECLINED, CHARACTER_FLAG_GHOST, CHARACTER_FLAG_HIDE_CLOAK, CHARACTER_FLAG_HIDE_HELM, CHARACTER_FLAG_LOCKED_BY_BILLING, CHARACTER_FLAG_RENAME, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_WARLOCK, CONFIG_DECLINED_NAMES_USED, ItemTemplate::DisplayInfoID, Field::Get(), INVENTORY_SLOT_BAG_END, ItemTemplate::InventoryType, IsValidGender(), LOG_ERROR, LOG_WARN, PERM_ENCHANTMENT_SLOT, PLAYER_EXTRA_SHOW_DK_PET, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, sObjectMgr, sSpellItemEnchantmentStore, sWorld, TEMP_ENCHANTMENT_SLOT, and Acore::Tokenize().

Referenced by WorldSession::HandleCharEnum().

◆ BuildPetTalentsInfoData()

void Player::BuildPetTalentsInfoData ( WorldPacket data)
14293{
14294 uint32 unspentTalentPoints = 0;
14295 std::size_t pointsPos = data->wpos();
14296 *data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
14297
14298 uint8 talentIdCount = 0;
14299 std::size_t countPos = data->wpos();
14300 *data << uint8(talentIdCount); // [PH], talentIdCount
14301
14302 Pet* pet = GetPet();
14303 if (!pet)
14304 return;
14305
14306 unspentTalentPoints = pet->GetFreeTalentPoints();
14307
14308 data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
14309
14310 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14311 if (!ci)
14312 return;
14313
14314 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14315 if (!pet_family || pet_family->petTalentType < 0)
14316 return;
14317
14318 for (uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
14319 {
14320 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentTabId);
14321 if (!talentTabInfo)
14322 continue;
14323
14324 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14325 continue;
14326
14327 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
14328 {
14329 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14330 if (!talentInfo)
14331 continue;
14332
14333 // skip another tab talents
14334 if (talentInfo->TalentTab != talentTabId)
14335 continue;
14336
14337 // find max talent rank (0~4)
14338 int8 curtalent_maxrank = -1;
14339 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14340 {
14341 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14342 {
14343 curtalent_maxrank = rank;
14344 break;
14345 }
14346 }
14347
14348 // not learned talent
14349 if (curtalent_maxrank < 0)
14350 continue;
14351
14352 *data << uint32(talentInfo->TalentID); // Talent.dbc
14353 *data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
14354
14355 ++talentIdCount;
14356 }
14357
14358 data->put<uint8>(countPos, talentIdCount); // put real count
14359
14360 break;
14361 }
14362}
DBCStorage< TalentTabEntry > sTalentTabStore(TalentTabEntryfmt)
DBCStorage< CreatureFamilyEntry > sCreatureFamilyStore(CreatureFamilyfmt)
#define MAX_TALENT_RANK
Definition: DBCStructure.h:1919
std::int8_t int8
Definition: Define.h:105
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:209
uint8 GetFreeTalentPoints()
Definition: Pet.h:131
bool HasSpell(uint32 spell) const override
Definition: Pet.cpp:2337
Definition: DBCStructure.h:754
int32 petTalentType
Definition: DBCStructure.h:762
uint32 TalentTab
Definition: DBCStructure.h:1926
Definition: DBCStructure.h:1941
uint32 petTalentMask
Definition: DBCStructure.h:1948

References Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), GetPet(), Pet::HasSpell(), MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, ByteBuffer::put(), TalentEntry::RankID, sCreatureFamilyStore, sTalentStore, sTalentTabStore, TalentEntry::TalentID, TalentEntry::TalentTab, and ByteBuffer::wpos().

Referenced by SendTalentsInfoData().

◆ BuildPlayerRepop()

void Player::BuildPlayerRepop ( )
4431{
4433 data << GetPackGUID();
4434 GetSession()->SendPacket(&data);
4435 if (getRace(true) == RACE_NIGHTELF)
4436 {
4437 CastSpell(this, 20584, true);
4438 }
4439 CastSpell(this, 8326, true);
4440
4441 // there must be SMSG.FORCE_RUN_SPEED_CHANGE, SMSG.FORCE_SWIM_SPEED_CHANGE, SMSG.MOVE_WATER_WALK
4442 // there must be SMSG.STOP_MIRROR_TIMER
4443
4444 // the player cannot have a corpse already on current map, only bones which are not returned by GetCorpse
4445 WorldLocation corpseLocation = GetCorpseLocation();
4446 if (GetCorpse() && corpseLocation.GetMapId() == GetMapId())
4447 {
4448 LOG_ERROR("entities.player", "BuildPlayerRepop: player {} ({}) already has a corpse", GetName(), GetGUID().ToString());
4449 return;
4450 }
4451
4452 // create a corpse and place it at the player's location
4453 Corpse* corpse = CreateCorpse();
4454 if (!corpse)
4455 {
4456 LOG_ERROR("entities.player", "Error creating corpse for Player {} [{}]", GetName(), GetGUID().ToString());
4457 return;
4458 }
4459 GetMap()->AddToMap(corpse);
4460 SetHealth(1); // convert player body to ghost
4462 SetWaterWalking(true);
4463 if (!GetSession()->isLogingOut())
4464 {
4466 }
4467 RemoveUnitFlag(UNIT_FLAG_SKINNABLE); // BG - remove insignia related
4468 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4469 if (corpseReclaimDelay >= 0)
4470 {
4471 SendCorpseReclaimDelay(corpseReclaimDelay);
4472 }
4473 corpse->ResetGhostTime(); // to prevent cheating
4474 StopMirrorTimers(); // disable timers on bars
4476 sScriptMgr->OnPlayerReleasedGhost(this);
4477}
@ UNIT_FIELD_BYTES_1
Definition: UpdateFields.h:131
@ UNIT_BYTE1_FLAG_ALWAYS_STAND
Definition: UnitDefines.h:59
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: UnitDefines.h:26
@ UNIT_FLAG_SKINNABLE
Definition: UnitDefines.h:276
@ MOVE_UNROOT
Definition: Player.h:463
@ MOVE_WATER_WALK
Definition: Player.h:464
@ RACE_NIGHTELF
Definition: SharedDefines.h:74
@ SMSG_PRE_RESURRECT
Definition: Opcodes.h:1202
Definition: Corpse.h:49
void ResetGhostTime()
Definition: Corpse.cpp:195
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:750
PackedGuid const & GetPackGUID() const
Definition: Object.h:115
Map * GetMap() const
Definition: Object.h:537
void SendCorpseReclaimDelay(uint32 delay)
Definition: Player.cpp:12922
void StopMirrorTimers()
Definition: Player.h:2064
WorldLocation GetCorpseLocation() const
Definition: Player.h:2048
Corpse * GetCorpse() const
Definition: Player.cpp:4715
bool SetWaterWalking(bool apply, bool packetOnly=false) override
Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for...
Definition: Player.cpp:15904
int32 CalculateCorpseReclaimDelay(bool load=false)
Definition: Player.cpp:12881
Corpse * CreateCorpse()
Definition: Player.cpp:4600
void SetMovement(PlayerMovementType pType)
Definition: Player.cpp:4400
void SetHealth(uint32 val)
Definition: Unit.cpp:15529
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:704
bool AddToMap(T *, bool checkTransport=false)
Definition: Map.cpp:394

References Map::AddToMap(), CalculateCorpseReclaimDelay(), Unit::CastSpell(), CreateCorpse(), GetCorpse(), GetCorpseLocation(), Object::GetGUID(), WorldObject::GetMap(), WorldLocation::GetMapId(), WorldObject::GetName(), Object::GetPackGUID(), Unit::getRace(), GetSession(), LOG_ERROR, MOVE_UNROOT, MOVE_WATER_WALK, RACE_NIGHTELF, Unit::RemoveUnitFlag(), Corpse::ResetGhostTime(), SendCorpseReclaimDelay(), WorldSession::SendPacket(), Object::SetByteValue(), Unit::SetHealth(), SetMovement(), SetWaterWalking(), SMSG_PRE_RESURRECT, sScriptMgr, StopMirrorTimers(), Position::ToString(), UNIT_BYTE1_FLAG_ALWAYS_STAND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, and UNIT_FLAG_SKINNABLE.

Referenced by Spell::EffectStuck(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), RemovedInsignia(), and Update().

◆ BuildPlayerTalentsInfoData()

void Player::BuildPlayerTalentsInfoData ( WorldPacket data)
14259{
14260 *data << uint32(GetFreeTalentPoints()); // unspentTalentPoints
14261 *data << uint8(m_specsCount); // talent group count (0, 1 or 2)
14262 *data << uint8(m_activeSpec); // talent group index (0 or 1)
14263
14266
14267 for (uint32 specIdx = 0; specIdx < m_specsCount; ++specIdx)
14268 {
14269 uint8 talentIdCount = 0;
14270 std::size_t pos = data->wpos();
14271 *data << uint8(talentIdCount); // [PH], talentIdCount
14272
14273 const PlayerTalentMap& talentMap = GetTalentMap();
14274 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
14275 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
14276 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(specIdx)) // pussywizard
14277 {
14278 *data << uint32(talentPos->talent_id); // Talent.dbc
14279 *data << uint8(talentPos->rank); // talentMaxRank (0-4)
14280 ++talentIdCount;
14281 }
14282
14283 data->put<uint8>(pos, talentIdCount); // put real count
14284
14285 *data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
14286
14287 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14288 *data << uint16(m_Glyphs[specIdx][i]); // GlyphProperties.dbc
14289 }
14290}
std::unordered_map< uint32, PlayerTalent * > PlayerTalentMap
Definition: Player.h:193
uint32 GetFreeTalentPoints() const
Definition: Player.h:1722
const PlayerTalentMap & GetTalentMap() const
Definition: Player.h:2620

References GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), m_activeSpec, m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, MAX_TALENT_SPECS, PLAYERSPELL_REMOVED, ByteBuffer::put(), and ByteBuffer::wpos().

Referenced by WorldSession::HandleInspectOpcode(), and SendTalentsInfoData().

◆ BuyItemFromVendorSlot()

bool Player::BuyItemFromVendorSlot ( ObjectGuid  vendorguid,
uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot 
)
10660{
10661 sScriptMgr->OnPlayerBeforeBuyItemFromVendor(this, vendorguid, vendorslot, item, count, bag, slot);
10662
10663 // this check can be used from the hook to implement a custom vendor process
10664 if (item == 0)
10665 return true;
10666
10667 // cheating attempt
10668 if (count < 1) count = 1;
10669
10670 // cheating attempt
10671 if (slot > MAX_BAG_SIZE && slot != NULL_SLOT)
10672 return false;
10673
10674 if (!IsAlive())
10675 return false;
10676
10677 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
10678 if (!pProto)
10679 {
10680 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10681 return false;
10682 }
10683
10684 if (!(pProto->AllowableClass & getClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())
10685 {
10686 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10687 return false;
10688 }
10689
10691 {
10692 return false;
10693 }
10694
10695 Creature* creature = GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR);
10696 if (!creature)
10697 {
10698 LOG_DEBUG("network", "WORLD: BuyItemFromVendor - Unit ({}) not found or you can't interact with him.", vendorguid.ToString());
10699 SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, nullptr, item, 0);
10700 return false;
10701 }
10702
10703 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), item);
10704 if (!sConditionMgr->IsObjectMeetToConditions(this, creature, conditions))
10705 {
10706 //LOG_DEBUG("condition", "BuyItemFromVendor: conditions not met for creature entry {} item {}", creature->GetEntry(), item);
10707 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10708 return false;
10709 }
10710
10711 VendorItemData const* vItems = GetSession()->GetCurrentVendor() ? sObjectMgr->GetNpcVendorItemList(GetSession()->GetCurrentVendor()) : creature->GetVendorItems();
10712 if (!vItems || vItems->Empty())
10713 {
10714 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10715 return false;
10716 }
10717
10718 if (vendorslot >= vItems->GetItemCount())
10719 {
10720 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10721 return false;
10722 }
10723
10724 VendorItem const* crItem = vItems->GetItem(vendorslot);
10725 // store diff item (cheating)
10726 if (!crItem || crItem->item != item)
10727 {
10728 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10729 return false;
10730 }
10731
10732 // check current item amount if it limited
10733 if (crItem->maxcount != 0)
10734 {
10735 if (creature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count)
10736 {
10737 SendBuyError(BUY_ERR_ITEM_ALREADY_SOLD, creature, item, 0);
10738 return false;
10739 }
10740 }
10741
10743 {
10744 SendBuyError(BUY_ERR_REPUTATION_REQUIRE, creature, item, 0);
10745 return false;
10746 }
10747
10748 if (crItem->ExtendedCost)
10749 {
10750 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10751 if (!iece)
10752 {
10753 LOG_ERROR("entities.player", "Item {} have wrong ExtendedCost field value {}", pProto->ItemId, crItem->ExtendedCost);
10754 return false;
10755 }
10756
10757 // honor points price
10758 if (GetHonorPoints() < (iece->reqhonorpoints * count))
10759 {
10761 return false;
10762 }
10763
10764 // arena points price
10765 if (GetArenaPoints() < (iece->reqarenapoints * count))
10766 {
10768 return false;
10769 }
10770
10771 // item base price
10772 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10773 {
10774 if (iece->reqitem[i] && !HasItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count)))
10775 {
10777 return false;
10778 }
10779 }
10780
10781 // check for personal arena rating requirement
10783 {
10784 // probably not the proper equip err
10785 SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, nullptr, nullptr);
10786 return false;
10787 }
10788 }
10789
10790 uint32 price = 0;
10791 if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32)
10792 {
10793 uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice;
10794 if ((uint32)count > maxCount)
10795 {
10796 LOG_ERROR("entities.player", "Player {} tried to buy {} item id {}, causing overflow", GetName(), (uint32)count, pProto->ItemId);
10797 count = (uint8)maxCount;
10798 }
10799 price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT
10800
10801 // reputation discount
10802 price = uint32(std::floor(price * GetReputationPriceDiscount(creature)));
10803
10804 if (!HasEnoughMoney(price))
10805 {
10806 SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, item, 0);
10807 return false;
10808 }
10809 }
10810
10811 if ((bag == NULL_BAG && slot == NULL_SLOT) || IsInventoryPos(bag, slot))
10812 {
10813 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, true))
10814 return false;
10815 }
10816 else if (IsEquipmentPos(bag, slot))
10817 {
10818 if (pProto->BuyCount * count != 1)
10819 {
10821 return false;
10822 }
10823 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false))
10824 return false;
10825 }
10826 else
10827 {
10829 return false;
10830 }
10831
10832 return crItem->maxcount != 0;
10833}
@ UNIT_NPC_FLAG_VENDOR
Definition: UnitDefines.h:322
#define MAX_MONEY_AMOUNT
Definition: Player.h:936
#define MAX_BAG_SIZE
Definition: Bag.h:22
@ EQUIP_ERR_CANT_EQUIP_RANK
Definition: Item.h:110
@ EQUIP_ERR_ITEM_CANT_BE_EQUIPPED
Definition: Item.h:67
@ EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS
Definition: Item.h:116
@ EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT
Definition: Item.h:50
@ EQUIP_ERR_VENDOR_MISSING_TURNINS
Definition: Item.h:115
@ EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS
Definition: Item.h:117
@ BUY_ERR_CANT_FIND_ITEM
Definition: Item.h:141
@ BUY_ERR_DISTANCE_TOO_FAR
Definition: Item.h:145
@ BUY_ERR_NOT_ENOUGHT_MONEY
Definition: Item.h:143
@ BUY_ERR_REPUTATION_REQUIRE
Definition: Item.h:149
@ BUY_ERR_ITEM_ALREADY_SOLD
Definition: Item.h:142
@ ITEM_FLAG2_FACTION_HORDE
Definition: ItemTemplate.h:183
@ ITEM_FLAG2_FACTION_ALLIANCE
Definition: ItemTemplate.h:184
#define sConditionMgr
Definition: ConditionMgr.h:290
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:237
@ TEAM_ALLIANCE
Definition: SharedDefines.h:760
@ TEAM_HORDE
Definition: SharedDefines.h:761
Definition: Creature.h:43
VendorItemData const * GetVendorItems() const
Definition: Creature.cpp:3070
uint32 GetVendorItemCurrentCount(VendorItem const *vItem)
Definition: Creature.cpp:3075
Definition: CreatureData.h:454
uint32 ExtendedCost
Definition: CreatureData.h:461
bool IsGoldRequired(ItemTemplate const *pProto) const
Definition: CreatureData.h:464
uint32 item
Definition: CreatureData.h:458
uint32 maxcount
Definition: CreatureData.h:459
Definition: CreatureData.h:469
VendorItem * GetItem(uint32 slot) const
Definition: CreatureData.h:472
bool Empty() const
Definition: CreatureData.h:479
uint8 GetItemCount() const
Definition: CreatureData.h:480
uint32 BuyCount
Definition: ItemTemplate.h:629
uint32 AllowableClass
Definition: ItemTemplate.h:633
int32 BuyPrice
Definition: ItemTemplate.h:630
bool HasFlag2(ItemFlags2 flag) const
Definition: ItemTemplate.h:828
uint32 RequiredReputationRank
Definition: ItemTemplate.h:643
uint32 RequiredReputationFaction
Definition: ItemTemplate.h:642
uint32 ItemId
Definition: ItemTemplate.h:620
bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
Definition: Player.cpp:10593
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition: PlayerStorage.cpp:655
bool HasEnoughMoney(uint32 amount) const
Definition: Player.h:1619
Creature * GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask)
Definition: Player.cpp:2083
bool IsGameMaster() const
Definition: Player.h:1176
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5883
void SendBuyError(BuyResult msg, Creature *creature, uint32 item, uint32 param)
Definition: PlayerStorage.cpp:4064
uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
If trans is specified, arena point save query will be added to trans.
Definition: Player.cpp:10835
uint32 GetCurrentVendor() const
Definition: WorldSession.h:380
uint32 reqarenaslot
Definition: DBCStructure.h:1190
uint32 reqpersonalarenarating
Definition: DBCStructure.h:1193

References _StoreOrEquipNewItem(), ItemTemplate::AllowableClass, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, BUY_ERR_CANT_FIND_ITEM, BUY_ERR_DISTANCE_TOO_FAR, BUY_ERR_ITEM_ALREADY_SOLD, BUY_ERR_NOT_ENOUGHT_MONEY, BUY_ERR_REPUTATION_REQUIRE, ItemTemplate::BuyCount, ItemTemplate::BuyPrice, VendorItemData::Empty(), EQUIP_ERR_CANT_EQUIP_RANK, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, EQUIP_ERR_VENDOR_MISSING_TURNINS, VendorItem::ExtendedCost, GetArenaPoints(), Unit::getClassMask(), WorldSession::GetCurrentVendor(), Object::GetEntry(), GetHonorPoints(), VendorItemData::GetItem(), VendorItemData::GetItemCount(), GetMaxPersonalArenaRatingRequirement(), WorldObject::GetName(), GetNPCIfCanInteractWith(), GetReputationPriceDiscount(), GetReputationRank(), GetSession(), GetTeamId(), Creature::GetVendorItemCurrentCount(), Creature::GetVendorItems(), HasEnoughMoney(), ItemTemplate::HasFlag2(), HasItemCount(), Unit::IsAlive(), IsEquipmentPos(), IsGameMaster(), VendorItem::IsGoldRequired(), IsInventoryPos(), VendorItem::item, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, MAX_BAG_SIZE, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, MAX_MONEY_AMOUNT, VendorItem::maxcount, NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqarenaslot, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, ItemExtendedCostEntry::reqpersonalarenarating, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, sConditionMgr, SendBuyError(), SendEquipError(), sItemExtendedCostStore, sObjectMgr, sScriptMgr, TEAM_ALLIANCE, TEAM_HORDE, ObjectGuid::ToString(), and UNIT_NPC_FLAG_VENDOR.

Referenced by WorldSession::HandleBuyItemInSlotOpcode(), and WorldSession::HandleBuyItemOpcode().

◆ CalcRage()

void Player::CalcRage ( uint32  damage,
bool  attacker 
)

◆ CalculateCorpseReclaimDelay()

int32 Player::CalculateCorpseReclaimDelay ( bool  load = false)
12882{
12883 Corpse* corpse = GetCorpse();
12884
12885 if (load && !corpse)
12886 return -1;
12887
12888 bool pvp = corpse ? corpse->GetType() == CORPSE_RESURRECTABLE_PVP : m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH;
12889
12890 uint32 delay;
12891
12892 if (load)
12893 {
12894 if (corpse->GetGhostTime() > m_deathExpireTime)
12895 return -1;
12896
12897 uint64 count = 0;
12898
12899 if ((pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP)) ||
12900 (!pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
12901 {
12902 count = (m_deathExpireTime - corpse->GetGhostTime()) / DEATH_EXPIRE_STEP;
12903
12904 if (count >= MAX_DEATH_COUNT)
12905 count = MAX_DEATH_COUNT - 1;
12906 }
12907
12908 time_t expected_time = corpse->GetGhostTime() + copseReclaimDelay[count];
12909 time_t now = GameTime::GetGameTime().count();
12910
12911 if (now >= expected_time)
12912 return -1;
12913
12914 delay = expected_time - now;
12915 }
12916 else
12917 delay = GetCorpseReclaimDelay(pvp);
12918
12919 return delay * IN_MILLISECONDS;
12920}
@ CORPSE_RESURRECTABLE_PVP
Definition: Corpse.h:30
@ PLAYER_EXTRA_PVP_DEATH
Definition: Player.h:598
#define DEATH_EXPIRE_STEP
Definition: Player.h:75
#define MAX_DEATH_COUNT
Definition: Player.h:76
static uint32 copseReclaimDelay[MAX_DEATH_COUNT]
Definition: Player.cpp:145
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP
Definition: IWorld.h:101
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE
Definition: IWorld.h:102
time_t const & GetGhostTime() const
Definition: Corpse.h:70
CorpseType GetType() const
Definition: Corpse.h:72
uint32 GetCorpseReclaimDelay(bool pvp) const
Definition: Player.cpp:12864

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, CORPSE_RESURRECTABLE_PVP, DEATH_EXPIRE_STEP, GetCorpse(), GetCorpseReclaimDelay(), GameTime::GetGameTime(), Corpse::GetGhostTime(), Corpse::GetType(), IN_MILLISECONDS, m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ CalculateMinMaxDamage()

void Player::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex 
)
overridevirtual

Implements Unit.

528{
529 // Only proto damage, not affected by any mods
530 if (damageIndex != 0)
531 {
532 minDamage = 0.0f;
533 maxDamage = 0.0f;
534
535 if (!IsInFeralForm() && CanUseAttackType(attType))
536 {
537 minDamage = GetWeaponDamageRange(attType, MINDAMAGE, damageIndex);
538 maxDamage = GetWeaponDamageRange(attType, MAXDAMAGE, damageIndex);
539 }
540
541 return;
542 }
543
544 UnitMods unitMod;
545
546 switch (attType)
547 {
548 case BASE_ATTACK:
549 default:
550 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
551 break;
552 case OFF_ATTACK:
553 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
554 break;
555 case RANGED_ATTACK:
556 unitMod = UNIT_MOD_DAMAGE_RANGED;
557 break;
558 }
559
560 float attackSpeedMod = GetAPMultiplier(attType, normalized);
561
562 float baseValue = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 14.0f * attackSpeedMod;
563 float basePct = GetModifierValue(unitMod, BASE_PCT);
564 float totalValue = GetModifierValue(unitMod, TOTAL_VALUE);
565 float totalPct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
566
567 float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);
568 float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);
569
570 if (IsAttackSpeedOverridenShapeShift()) // forms with no override on attack speed use normal weapon damage
571 {
572 uint8 lvl = GetLevel();
573 if (lvl > 60)
574 lvl = 60;
575
576 weaponMinDamage = lvl * 0.85f * attackSpeedMod;
577 weaponMaxDamage = lvl * 1.25f * attackSpeedMod;
578 }
579 else if (!CanUseAttackType(attType)) // check if player not in form but still can't use (disarm case)
580 {
581 // cannot use ranged/off attack, set values to 0
582 if (attType != BASE_ATTACK)
583 {
584 minDamage = 0.0f;
585 maxDamage = 0.0f;
586 return;
587 }
588 weaponMinDamage = BASE_MINDAMAGE;
589 weaponMaxDamage = BASE_MAXDAMAGE;
590 }
591 else if (attType == RANGED_ATTACK) // add ammo DPS to ranged damage
592 {
593 weaponMinDamage += GetAmmoDPS() * attackSpeedMod;
594 weaponMaxDamage += GetAmmoDPS() * attackSpeedMod;
595 }
596
597 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
598 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
599
600 // pussywizard: crashfix (casting negative to uint => min > max => assertion in urand)
601 if (minDamage < 0.0f || minDamage > 1000000000.0f)
602 minDamage = 0.0f;
603 if (maxDamage < 0.0f || maxDamage > 1000000000.0f)
604 maxDamage = 0.0f;
605 if (minDamage > maxDamage)
606 minDamage = maxDamage;
607}
@ BASE_PCT
Definition: Unit.h:128
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition: Unit.cpp:15479
float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const
Definition: Unit.cpp:15339
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition: Unit.cpp:17251
bool IsAttackSpeedOverridenShapeShift() const
Definition: Unit.cpp:19280

References BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, Unit::CanUseAttackType(), GetAmmoDPS(), Unit::GetAPMultiplier(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetTotalAttackPowerValue(), Unit::GetWeaponDamageRange(), Unit::IsAttackSpeedOverridenShapeShift(), Unit::IsInFeralForm(), MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

◆ CalculateQuestRewardXP()

uint32 Player::CalculateQuestRewardXP ( Quest const *  quest)
1403{
1404 // apply world quest rate
1405 uint32 xp = uint32(quest->XPValue(GetLevel()) * GetQuestRate(quest->IsDFQuest()));
1406
1407 // handle SPELL_AURA_MOD_XP_QUEST_PCT auras
1409 for (Unit::AuraEffectList::const_iterator i = ModXPPctAuras.begin(); i != ModXPPctAuras.end(); ++i)
1410 AddPct(xp, (*i)->GetAmount());
1411
1412 return xp;
1413}
@ SPELL_AURA_MOD_XP_QUEST_PCT
Definition: SpellAuraDefines.h:354
T AddPct(T &base, U pct)
Definition: Util.h:67
float GetQuestRate(bool isDFQuest=false)
Definition: Player.cpp:16188

References AddPct(), Unit::GetAuraEffectsByType(), Unit::GetLevel(), GetQuestRate(), Quest::IsDFQuest(), SPELL_AURA_MOD_XP_QUEST_PCT, and Quest::XPValue().

Referenced by RewardQuest(), PlayerMenu::SendQuestGiverOfferReward(), and PlayerMenu::SendQuestGiverQuestDetails().

◆ CalculateReputationGain()

float Player::CalculateReputationGain ( ReputationSource  source,
uint32  creatureOrQuestLevel,
float  rep,
int32  faction,
bool  noQuestBonus = false 
)
5891{
5892 float percent = 100.0f;
5893
5894 float repMod = noQuestBonus ? 0.0f : float(GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN));
5895
5896 // faction specific auras only seem to apply to kills
5897 if (source == REPUTATION_SOURCE_KILL)
5899
5900 percent += rep > 0.f ? repMod : -repMod;
5901
5902 float rate;
5903 switch (source)
5904 {
5906 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_KILL);
5907 break;
5913 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST);
5914 break;
5916 default:
5917 rate = 1.0f;
5918 break;
5919 }
5920
5921 if (rate != 1.0f && creatureOrQuestLevel <= Acore::XP::GetGrayLevel(GetLevel()))
5922 percent *= rate;
5923
5924 if (percent <= 0.0f)
5925 return 0;
5926
5927 // Multiply result with the faction specific rate
5928 if (RepRewardRate const* repData = sObjectMgr->GetRepRewardRate(faction))
5929 {
5930 float repRate = 0.0f;
5931 switch (source)
5932 {
5934 repRate = repData->creatureRate;
5935 break;
5937 repRate = repData->questRate;
5938 break;
5940 repRate = repData->questDailyRate;
5941 break;
5943 repRate = repData->questWeeklyRate;
5944 break;
5946 repRate = repData->questMonthlyRate;
5947 break;
5949 repRate = repData->questRepeatableRate;
5950 break;
5952 repRate = repData->spellRate;
5953 break;
5954 }
5955
5956 // for custom, a rate of 0.0 will totally disable reputation gain for this faction/type
5957 if (repRate <= 0.0f)
5958 return 0;
5959
5960 percent *= repRate;
5961 }
5962
5963 if (source != REPUTATION_SOURCE_SPELL && GetsRecruitAFriendBonus(false))
5964 percent *= 1.0f + sWorld->getRate(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS);
5965
5966 return CalculatePct(rep, percent);
5967}
@ REPUTATION_SOURCE_KILL
Definition: Player.h:240
@ REPUTATION_SOURCE_SPELL
Definition: Player.h:246
@ REPUTATION_SOURCE_QUEST
Definition: Player.h:241
@ REPUTATION_SOURCE_MONTHLY_QUEST
Definition: Player.h:244
@ REPUTATION_SOURCE_REPEATABLE_QUEST
Definition: Player.h:245
@ REPUTATION_SOURCE_WEEKLY_QUEST
Definition: Player.h:243
@ REPUTATION_SOURCE_DAILY_QUEST
Definition: Player.h:242
@ SPELL_AURA_MOD_REPUTATION_GAIN
Definition: SpellAuraDefines.h:219
@ SPELL_AURA_MOD_FACTION_REPUTATION_GAIN
Definition: SpellAuraDefines.h:253
@ RATE_REPUTATION_LOWLEVEL_QUEST
Definition: IWorld.h:489
@ RATE_REPUTATION_LOWLEVEL_KILL
Definition: IWorld.h:488
@ RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS
Definition: IWorld.h:490
uint8 GetGrayLevel(uint8 pl_level)
Definition: Formulas.h:46
bool GetsRecruitAFriendBonus(bool forXP)
Definition: Player.cpp:12633
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6070
Definition: ObjectMgr.h:557

References CalculatePct(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), RATE_REPUTATION_LOWLEVEL_KILL, RATE_REPUTATION_LOWLEVEL_QUEST, RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_KILL, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_SPELL, REPUTATION_SOURCE_WEEKLY_QUEST, sObjectMgr, SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, SPELL_AURA_MOD_REPUTATION_GAIN, and sWorld.

Referenced by Spell::EffectReputation(), and RewardReputation().

◆ CalculateTalentsPoints()

uint32 Player::CalculateTalentsPoints ( ) const
13565{
13566 uint32 base_talent = GetLevel() < 10 ? 0 : GetLevel() - 9;
13567
13568 uint32 talentPointsForLevel = 0;
13570 {
13571 talentPointsForLevel = base_talent;
13572 }
13573 else
13574 {
13575 talentPointsForLevel = GetLevel() < 56 ? 0 : GetLevel() - 55;
13576 talentPointsForLevel += m_questRewardTalentCount;
13577
13578 if (talentPointsForLevel > base_talent)
13579 {
13580 talentPointsForLevel = base_talent;
13581 }
13582 }
13583
13584 talentPointsForLevel += m_extraBonusTalentCount;
13585 sScriptMgr->OnPlayerCalculateTalentsPoints(this, talentPointsForLevel);
13586 return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT));
13587}
@ CLASS_CONTEXT_TALENT_POINT_CALC
Definition: UnitDefines.h:233
@ MAP_EBON_HOLD
Definition: AreaDefines.h:257
@ RATE_TALENT
Definition: IWorld.h:517

References CLASS_CONTEXT_TALENT_POINT_CALC, CLASS_DEATH_KNIGHT, Unit::GetLevel(), WorldLocation::GetMapId(), IsClass(), m_extraBonusTalentCount, m_questRewardTalentCount, MAP_EBON_HOLD, RATE_TALENT, sScriptMgr, and sWorld.

Referenced by InitTalentForLevel(), and resetTalents().

◆ CanAddQuest()

bool Player::CanAddQuest ( Quest const *  quest,
bool  msg 
)
265{
266 if (!SatisfyQuestLog(msg))
267 return false;
268
269 uint32 srcitem = quest->GetSrcItemId();
270 if (srcitem > 0)
271 {
272 uint32 count = quest->GetSrcItemCount();
273 ItemPosCountVec dest;
274 InventoryResult msg2 = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
275
276 // player already have max number (in most case 1) source item, no additional item needed and quest can be added.
278 return true;
279 else if (msg2 != EQUIP_ERR_OK)
280 {
281 SendEquipError(msg2, nullptr, nullptr, srcitem);
282 PlayDirectSound(QUEST_SOUND_FAILURE, this); // Play failure sound
283 return false;
284 }
285 }
286 return true;
287}
@ QUEST_SOUND_FAILURE
Definition: Player.h:251
@ EQUIP_ERR_CANT_CARRY_MORE_OF_THIS
Definition: Item.h:64
void PlayDirectSound(uint32 sound_id, Player *target=nullptr)
Definition: Object.cpp:2903
bool SatisfyQuestLog(bool msg)
Definition: PlayerQuest.cpp:984

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, WorldObject::PlayDirectSound(), QUEST_SOUND_FAILURE, SatisfyQuestLog(), and SendEquipError().

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ CanAlwaysSee()

bool Player::CanAlwaysSee ( WorldObject const *  obj) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11401{
11402 // Always can see self
11403 if (m_mover == obj)
11404 return true;
11405
11407 if (obj->GetGUID() == guid)
11408 return true;
11409
11410 return false;
11411}
@ PLAYER_FARSIGHT
Definition: UpdateFields.h:334

References Object::GetGUID(), Object::GetGuidValue(), m_mover, and PLAYER_FARSIGHT.

◆ CanBankItem()

InventoryResult Player::CanBankItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
2033{
2034 if (!pItem)
2036
2037 uint32 count = pItem->GetCount();
2038
2039 LOG_DEBUG("entities.player.items", "STORAGE: CanBankItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, pItem->GetEntry(), pItem->GetCount());
2040 ItemTemplate const* pProto = pItem->GetTemplate();
2041 if (!pProto)
2043
2044 // Xinef: Removed next loot generated check
2045 if (pItem->GetGUID() == GetLootGUID())
2047
2048 if (pItem->IsBindedNotWith(this))
2050
2051 // Currency tokens are not supposed to be swapped out of their hidden bag
2052 uint8 pItemslot = pItem->GetSlot();
2053 if (pItemslot >= CURRENCYTOKEN_SLOT_START && pItemslot < CURRENCYTOKEN_SLOT_END)
2054 {
2055 LOG_ERROR("entities.player", "Possible hacking attempt: Player {} [{}] tried to move token [{}, entry: {}] out of the currency bag!",
2056 GetName(), GetGUID().ToString(), pItem->GetGUID().ToString(), pProto->ItemId);
2058 }
2059
2060 // check count of items (skip for auto move for same player from bank)
2062 if (res != EQUIP_ERR_OK)
2063 return res;
2064
2065 // in specific slot
2066 if (bag != NULL_BAG && slot != NULL_SLOT)
2067 {
2068 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
2069 {
2070 if (!pItem->IsBag())
2072
2075
2076 res = CanUseItem(pItem, not_loading);
2077 if (res != EQUIP_ERR_OK)
2078 return res;
2079 }
2080
2081 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
2082 if (res != EQUIP_ERR_OK)
2083 return res;
2084
2085 if (count == 0)
2086 return EQUIP_ERR_OK;
2087 }
2088
2089 // not specific slot or have space for partly store only in specific slot
2090
2091 // in specific bag
2092 if (bag != NULL_BAG)
2093 {
2094 if (pItem->IsNotEmptyBag())
2096
2097 // search stack in bag for merge to
2098 if (pProto->Stackable != 1)
2099 {
2100 if (bag == INVENTORY_SLOT_BAG_0)
2101 {
2102 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2103 if (res != EQUIP_ERR_OK)
2104 return res;
2105
2106 if (count == 0)
2107 return EQUIP_ERR_OK;
2108 }
2109 else
2110 {
2111 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
2112 if (res != EQUIP_ERR_OK)
2113 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
2114
2115 if (res != EQUIP_ERR_OK)
2116 return res;
2117
2118 if (count == 0)
2119 return EQUIP_ERR_OK;
2120 }
2121 }
2122
2123 // search free slot in bag
2124 if (bag == INVENTORY_SLOT_BAG_0)
2125 {
2126 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2127 if (res != EQUIP_ERR_OK)
2128 return res;
2129
2130 if (count == 0)
2131 return EQUIP_ERR_OK;
2132 }
2133 else
2134 {
2135 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
2136 if (res != EQUIP_ERR_OK)
2137 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
2138
2139 if (res != EQUIP_ERR_OK)
2140 return res;
2141
2142 if (count == 0)
2143 return EQUIP_ERR_OK;
2144 }
2145 }
2146
2147 // not specific bag or have space for partly store only in specific bag
2148
2149 // search stack for merge to
2150 if (pProto->Stackable != 1)
2151 {
2152 // in slots
2153 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2154 if (res != EQUIP_ERR_OK)
2155 return res;
2156
2157 if (count == 0)
2158 return EQUIP_ERR_OK;
2159
2160 // in special bags
2161 if (pProto->BagFamily)
2162 {
2163 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2164 {
2165 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
2166 if (res != EQUIP_ERR_OK)
2167 continue;
2168
2169 if (count == 0)
2170 return EQUIP_ERR_OK;
2171 }
2172 }
2173
2174 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2175 {
2176 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
2177 if (res != EQUIP_ERR_OK)
2178 continue;
2179
2180 if (count == 0)
2181 return EQUIP_ERR_OK;
2182 }
2183 }
2184
2185 // search free place in special bag
2186 if (pProto->BagFamily)
2187 {
2188 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2189 {
2190 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
2191 if (res != EQUIP_ERR_OK)
2192 continue;
2193
2194 if (count == 0)
2195 return EQUIP_ERR_OK;
2196 }
2197 }
2198
2199 // search free space
2200 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2201 if (res != EQUIP_ERR_OK)
2202 return res;
2203
2204 if (count == 0)
2205 return EQUIP_ERR_OK;
2206
2207 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2208 {
2209 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
2210 if (res != EQUIP_ERR_OK)
2211 continue;
2212
2213 if (count == 0)
2214 return EQUIP_ERR_OK;
2215 }
2216 return EQUIP_ERR_BANK_FULL;
2217}
@ BANK_SLOT_BAG_START
Definition: Player.h:723
@ BANK_SLOT_ITEM_START
Definition: Player.h:717
@ BANK_SLOT_ITEM_END
Definition: Player.h:718
@ EQUIP_ERR_ALREADY_LOOTED
Definition: Item.h:96
@ EQUIP_ERR_DONT_OWN_THAT_ITEM
Definition: Item.h:79
@ EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT
Definition: Item.h:81
@ EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG
Definition: Item.h:52
@ EQUIP_ERR_BANK_FULL
Definition: Item.h:98
@ EQUIP_ERR_ITEM_NOT_FOUND
Definition: Item.h:70
@ EQUIP_ERR_ITEMS_CANT_BE_SWAPPED
Definition: Item.h:68
bool IsBindedNotWith(Player const *player) const
Definition: Item.cpp:1132
bool IsBag() const
Definition: Item.h:254
bool IsNotEmptyBag() const
Definition: Item.cpp:311
uint32 BagFamily
Definition: ItemTemplate.h:679
int32 Stackable
Definition: ItemTemplate.h:645
uint8 GetBankBagSlotCount() const
Definition: Player.h:1283
ObjectGuid GetLootGUID() const
Definition: Player.h:2002
InventoryResult CanTakeMoreSimilarItems(Item *pItem) const
Definition: Player.h:1290
InventoryResult CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition: PlayerStorage.cpp:1050
InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition: PlayerStorage.cpp:980
InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
Definition: PlayerStorage.cpp:909
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
Definition: PlayerStorage.cpp:2219

References ItemTemplate::BagFamily, BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CanUseItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_BANK_FULL, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, GetBankBagSlotCount(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetLootGUID(), WorldObject::GetName(), Item::GetSlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, Item::IsBag(), Item::IsBindedNotWith(), Item::IsNotEmptyBag(), ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, NULL_BAG, NULL_SLOT, ItemTemplate::Stackable, ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), SplitItem(), and SwapItem().

◆ CanBlock()

bool Player::CanBlock ( ) const
inline
2195{ return m_canBlock; }

References m_canBlock.

Referenced by UpdateBlockPercentage().

◆ CanCaptureTowerPoint()

bool Player::CanCaptureTowerPoint ( ) const
13187{
13188 return (!HasStealthAura() && // not stealthed
13189 !HasInvisibilityAura() && // not invisible
13190 IsAlive() // live player
13191 );
13192}
bool HasStealthAura() const
Definition: Unit.h:1746
bool HasInvisibilityAura() const
Definition: Unit.h:1748

References Unit::HasInvisibilityAura(), Unit::HasStealthAura(), and Unit::IsAlive().

◆ CanCompleteQuest()

bool Player::CanCompleteQuest ( uint32  quest_id,
const QuestStatusData q_savedStatus = nullptr 
)
290{
291 if (quest_id)
292 {
293 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
294 if (!qInfo)
295 return false;
296
297 // Xinef: take seasonals into account
298 if (!qInfo->IsRepeatable() && !qInfo->IsSeasonal() && IsQuestRewarded(quest_id))
299 return false; // not allow re-complete quest
300
301 // auto complete quest
302 if ((qInfo->IsAutoComplete() || !qInfo->GetQuestMethod()) && CanTakeQuest(qInfo, false))
303 return true;
304
305 QuestStatusData q_status;
306 if (q_savedStatus)
307 q_status = *q_savedStatus;
308 else
309 {
310 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
311 if (itr == m_QuestStatus.end())
312 return false;
313
314 q_status = itr->second;
315 }
316
317 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
318 {
320 {
321 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
322 {
323 if (qInfo->RequiredItemCount[i] != 0 && q_status.ItemCount[i] < qInfo->RequiredItemCount[i])
324 return false;
325 }
326 }
327
329 {
330 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
331 {
332 if (qInfo->RequiredNpcOrGo[i] == 0)
333 continue;
334
335 if (qInfo->RequiredNpcOrGoCount[i] != 0 && q_status.CreatureOrGOCount[i] < qInfo->RequiredNpcOrGoCount[i])
336 return false;
337 }
338 }
339
341 if (qInfo->GetPlayersSlain() != 0 && q_status.PlayerCount < qInfo->GetPlayersSlain())
342 return false;
343
345 return false;
346
347 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && q_status.Timer == 0)
348 return false;
349
350 if (qInfo->GetRewOrReqMoney() < 0)
351 {
352 if (!HasEnoughMoney(-qInfo->GetRewOrReqMoney()))
353 return false;
354 }
355
356 uint32 repFacId = qInfo->GetRepObjectiveFaction();
357 if (repFacId && GetReputationMgr().GetReputation(repFacId) < qInfo->GetRepObjectiveValue())
358 return false;
359
360 return true;
361 }
362 }
363 return false;
364}
@ QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT
Definition: QuestDef.h:161
bool CanTakeQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:251
uint32 GetReputation(uint32 factionentry) const
Definition: Player.cpp:15280
bool IsQuestRewarded(uint32 quest_id) const
Definition: Player.h:1639
bool HasSpecialFlag(uint32 flag) const
Definition: QuestDef.h:224
int32 GetRepObjectiveValue() const
Definition: QuestDef.h:240
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:304
uint32 GetRepObjectiveFaction() const
Definition: QuestDef.h:239
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:305
bool IsRepeatable() const
Definition: QuestDef.h:283
bool IsAutoComplete() const
Definition: QuestDef.cpp:274
uint32 GetPlayersSlain() const
Definition: QuestDef.h:254
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:301
int32 GetRewOrReqMoney(uint8 playerLevel=0) const
Definition: QuestDef.cpp:238
bool IsSeasonal() const
Definition: QuestDef.h:290
uint32 GetQuestMethod() const
Definition: QuestDef.h:229

References CanTakeQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Quest::GetPlayersSlain(), Quest::GetQuestMethod(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveValue(), GetReputation(), GetReputationMgr(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QuestStatusData::ItemCount, m_QuestStatus, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, QuestStatusData::Status, and QuestStatusData::Timer.

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), and TalkedToCreature().

◆ CanCompleteRepeatableQuest()

bool Player::CanCompleteRepeatableQuest ( Quest const *  quest)
367{
368 // Solve problem that player don't have the quest and try complete it.
369 // if repeatable she must be able to complete event if player don't have it.
370 // Seem that all repeatable quest are DELIVER Flag so, no need to add more.
371 if (!CanTakeQuest(quest, false))
372 return false;
373
374 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
375 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
376 if (quest->RequiredItemId[i] && quest->RequiredItemCount[i] && !HasItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i]))
377 return false;
378
379 if (!CanRewardQuest(quest, false))
380 return false;
381
382 return true;
383}
bool CanRewardQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:385

References CanRewardQuest(), CanTakeQuest(), HasItemCount(), Quest::HasSpecialFlag(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverCompleteQuest(), and SendPreparedQuest().

◆ CanEnterWater()

bool Player::CanEnterWater ( ) const
inlineoverridevirtual

Implements Unit.

2580{ return true; }

◆ CanEquipItem()

InventoryResult Player::CanEquipItem ( uint8  slot,
uint16 dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
1806{
1807 dest = 0;
1808 if (pItem)
1809 {
1810 LOG_DEBUG("entities.player.items", "STORAGE: CanEquipItem slot = {}, item = {}, count = {}", slot, pItem->GetEntry(), pItem->GetCount());
1811 ItemTemplate const* pProto = pItem->GetTemplate();
1812 if (pProto)
1813 {
1814 if (!sScriptMgr->OnPlayerCanEquipItem(const_cast<Player*>(this), slot, dest, pItem, swap, not_loading))
1816
1817 // item used
1818 if (pItem->m_lootGenerated)
1820
1821 if (pItem->IsBindedNotWith(this))
1823
1824 // check count of items (skip for auto move for same player from bank)
1826 if (res != EQUIP_ERR_OK)
1827 return res;
1828
1829 // check this only in game
1830 if (not_loading)
1831 {
1832 // May be here should be more stronger checks; STUNNED checked
1833 // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked.
1836
1837 // do not allow equipping gear except weapons, offhands, projectiles, relics in
1838 // - combat
1839 // - in-progress arenas
1840 if (!pProto->CanChangeEquipStateInCombat())
1841 {
1842 if (IsInCombat())
1844
1845 if (Battleground* bg = GetBattleground())
1846 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
1848 }
1849
1850 if (IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer != 0)
1851 return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err
1852
1853 if (IsNonMeleeSpellCast(false))
1855 }
1856
1858 // check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items)
1859 if (ssd && ssd->MaxLevel < DEFAULT_MAX_LEVEL && ssd->MaxLevel < GetLevel())
1861
1862 uint8 eslot = FindEquipSlot(pProto, slot, swap);
1863 if (eslot == NULL_SLOT)
1865
1866 // Xinef: dont allow to equip items on disarmed slot
1867 if (!CanUseAttackType(GetAttackBySlot(eslot)))
1869
1870 res = CanUseItem(pItem, not_loading);
1871 if (res != EQUIP_ERR_OK)
1872 return res;
1873
1874 if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot))
1876
1877 // if we are swapping 2 equipped items, CanEquipUniqueItem check
1878 // should ignore the item we are trying to swap, and not the
1879 // destination item. CanEquipUniqueItem should ignore destination
1880 // item only when we are swapping weapon from bag
1881 uint8 ignore = uint8(NULL_SLOT);
1882 switch (eslot)
1883 {
1885 ignore = EQUIPMENT_SLOT_OFFHAND;
1886 break;
1888 ignore = EQUIPMENT_SLOT_MAINHAND;
1889 break;
1891 ignore = EQUIPMENT_SLOT_FINGER2;
1892 break;
1894 ignore = EQUIPMENT_SLOT_FINGER1;
1895 break;
1897 ignore = EQUIPMENT_SLOT_TRINKET2;
1898 break;
1900 ignore = EQUIPMENT_SLOT_TRINKET1;
1901 break;
1902 }
1903
1904 if (ignore == uint8(NULL_SLOT) || pItem != GetItemByPos(INVENTORY_SLOT_BAG_0, ignore))
1905 ignore = eslot;
1906
1907 InventoryResult res2 = CanEquipUniqueItem(pItem, swap ? ignore : uint8(NULL_SLOT));
1908 if (res2 != EQUIP_ERR_OK)
1909 return res2;
1910
1911 // check unique-equipped special item classes
1912 if (pProto->Class == ITEM_CLASS_QUIVER)
1914 if (Item* pBag = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
1915 if (pBag != pItem)
1916 if (ItemTemplate const* pBagProto = pBag->GetTemplate())
1917 if (pBagProto->Class == pProto->Class && (!swap || pBag->GetSlot() != eslot))
1918 return (pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
1921
1922 uint32 type = pProto->InventoryType;
1923
1924 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1925 {
1926 // Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1927 // xinef: same for fishing poles
1930
1931 else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1932 {
1933 if (!CanDualWield())
1935 }
1936 else if (type == INVTYPE_2HWEAPON)
1937 {
1938 if (!CanDualWield() || !CanTitanGrip())
1940 }
1941
1942 // Do not allow offhand with main hand polearm, staff or fishing pole
1944 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
1945 if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM ||
1946 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF ||
1947 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_FISHING_POLE)
1949
1950 if (IsTwoHandUsed())
1952 }
1953
1954 // equip two-hand weapon case (with possible unequip 2 items)
1955 if (type == INVTYPE_2HWEAPON)
1956 {
1957 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1958 {
1959 if (!CanTitanGrip())
1961 }
1962 else if (eslot != EQUIPMENT_SLOT_MAINHAND)
1964
1966 {
1967 // offhand item must can be stored in inventory for offhand item and it also must be unequipped
1969 ItemPosCountVec off_dest;
1970 if (offItem && (!not_loading ||
1972 CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK))
1974 }
1975 }
1976 dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
1977 return EQUIP_ERR_OK;
1978 }
1979 }
1980
1982}
@ EQUIPMENT_SLOT_FINGER1
Definition: Player.h:691
@ EQUIPMENT_SLOT_FINGER2
Definition: Player.h:692
@ EQUIPMENT_SLOT_TRINKET1
Definition: Player.h:693
@ EQUIPMENT_SLOT_TRINKET2
Definition: Player.h:694
@ EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH
Definition: Item.h:89
@ EQUIP_ERR_CANT_DUAL_WIELD
Definition: Item.h:61
@ EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE
Definition: Item.h:56
@ EQUIP_ERR_NOT_DURING_ARENA_MATCH
Definition: Item.h:124
@ EQUIP_ERR_NOT_IN_COMBAT
Definition: Item.h:107
@ EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED
Definition: Item.h:60
@ EQUIP_ERR_NOT_WHILE_DISARMED
Definition: Item.h:108
@ EQUIP_ERR_CANT_DO_RIGHT_NOW
Definition: Item.h:86
@ EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER
Definition: Item.h:80
@ EQUIP_ERR_YOU_ARE_STUNNED
Definition: Item.h:84
@ EQUIP_ERR_INVENTORY_FULL
Definition: Item.h:97
@ INVTYPE_RELIC
Definition: ItemTemplate.h:284
@ ITEM_SUBCLASS_AMMO_POUCH
Definition: ItemTemplate.h:481
@ ITEM_CLASS_QUIVER
Definition: ItemTemplate.h:302
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:293
@ STATUS_IN_PROGRESS
Definition: Battleground.h:193
#define DEFAULT_MAX_LEVEL
Definition: DBCEnums.h:35
Definition: Battleground.h:294
bool m_lootGenerated
Definition: Item.h:321
bool CanChangeEquipStateInCombat() const
Definition: ItemTemplate.h:707
uint32 ScalingStatDistribution
Definition: ItemTemplate.h:649
uint32 SubClass
Definition: ItemTemplate.h:622
Definition: Player.h:1082
InventoryResult CanUnequipItem(uint16 src, bool swap) const
Definition: PlayerStorage.cpp:1984
InventoryResult CanEquipUniqueItem(Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
Definition: Player.cpp:13730
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12144
uint8 FindEquipSlot(ItemTemplate const *proto, uint32 slot, bool swap) const
Definition: PlayerStorage.cpp:125

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanDualWield(), CanEquipUniqueItem(), CanStoreItem(), CanTakeMoreSimilarItems(), CanTitanGrip(), CanUnequipItem(), Unit::CanUseAttackType(), CanUseItem(), ItemTemplate::Class, DEFAULT_MAX_LEVEL, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH, EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_DUAL_WIELD, EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_STUNNED, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, FindEquipSlot(), GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Unit::GetLevel(), Item::GetTemplate(), Unit::HasUnitState(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_RELIC, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, Item::IsBindedNotWith(), Unit::IsInCombat(), Unit::IsNonMeleeSpellCast(), IsTwoHandUsed(), ITEM_CLASS_QUIVER, ITEM_CLASS_WEAPON, ITEM_SUBCLASS_AMMO_POUCH, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, LOG_DEBUG, Item::m_lootGenerated, m_weaponChangeTimer, ScalingStatDistributionEntry::MaxLevel, NULL_BAG, NULL_SLOT, ItemTemplate::ScalingStatDistribution, sScalingStatDistributionStore, sScriptMgr, STATUS_IN_PROGRESS, ItemTemplate::SubClass, and UNIT_STATE_STUNNED.

Referenced by _LoadInventory(), CanEquipNewItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleEquipmentSetUse(), SplitItem(), and SwapItem().

◆ CanEquipNewItem()

InventoryResult Player::CanEquipNewItem ( uint8  slot,
uint16 dest,
uint32  item,
bool  swap 
) const
1792{
1793 dest = 0;
1794 Item* pItem = Item::CreateItem(item, 1, this);
1795 if (pItem)
1796 {
1797 InventoryResult result = CanEquipItem(slot, dest, pItem, swap);
1798 delete pItem;
1799 return result;
1800 }
1801
1803}
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition: Item.cpp:1087

References CanEquipItem(), Item::CreateItem(), and EQUIP_ERR_ITEM_NOT_FOUND.

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ CanEquipUniqueItem() [1/2]

InventoryResult Player::CanEquipUniqueItem ( Item pItem,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13731{
13732 ItemTemplate const* pProto = pItem->GetTemplate();
13733
13734 // proto based limitations
13735 if (InventoryResult res = CanEquipUniqueItem(pProto, eslot, limit_count))
13736 return res;
13737
13738 // check unique-equipped on gems
13739 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
13740 {
13741 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
13742 if (!enchant_id)
13743 continue;
13744 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
13745 if (!enchantEntry)
13746 continue;
13747
13748 ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->GemID);
13749 if (!pGem)
13750 continue;
13751
13752 // include for check equip another gems with same limit category for not equipped item (and then not counted)
13753 uint32 gem_limit_count = !pItem->IsEquipped() && pGem->ItemLimitCategory
13755
13756 if (InventoryResult res = CanEquipUniqueItem(pGem, eslot, gem_limit_count))
13757 return res;
13758 }
13759
13760 return EQUIP_ERR_OK;
13761}
uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const
Definition: Item.cpp:1033
uint32 ItemLimitCategory
Definition: ItemTemplate.h:687
uint32 GemID
Definition: DBCStructure.h:1853

References CanEquipUniqueItem(), EQUIP_ERR_OK, SpellItemEnchantmentEntry::GemID, Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), Item::GetTemplate(), Item::IsEquipped(), ItemTemplate::ItemLimitCategory, sObjectMgr, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by CanEquipItem(), CanEquipUniqueItem(), and WorldSession::HandleSocketOpcode().

◆ CanEquipUniqueItem() [2/2]

InventoryResult Player::CanEquipUniqueItem ( ItemTemplate const *  itemProto,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13764{
13765 // check unique-equipped on item
13766 if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE))
13767 {
13768 // there is an equip limit on this item
13769 if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot))
13771 }
13772
13773 // check unique-equipped limit
13774 if (itemProto->ItemLimitCategory)
13775 {
13776 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory);
13777 if (!limitEntry)
13779
13780 // NOTE: limitEntry->mode not checked because if item have have-limit then it applied and to equip case
13781
13782 if (limit_count > limitEntry->maxCount)
13784
13785 // there is an equip limit on this item
13786 if (HasItemOrGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->maxCount - limit_count + 1, except_slot))
13788 }
13789
13790 return EQUIP_ERR_OK;
13791}
DBCStorage< ItemLimitCategoryEntry > sItemLimitCategoryStore(ItemLimitCategoryEntryfmt)
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED
Definition: Item.h:135
@ EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE
Definition: Item.h:114
@ EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED
Definition: Item.h:121
@ ITEM_FLAG_UNIQUE_EQUIPPABLE
Definition: ItemTemplate.h:166
bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition: PlayerStorage.cpp:728
bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition: PlayerStorage.cpp:766
Definition: DBCStructure.h:1197
uint32 maxCount
Definition: DBCStructure.h:1201

References EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE, EQUIP_ERR_OK, ItemTemplate::HasFlag(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), ITEM_FLAG_UNIQUE_EQUIPPABLE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemLimitCategoryEntry::maxCount, and sItemLimitCategoryStore.

◆ CanExecutePendingSpellCastRequest()

bool Player::CanExecutePendingSpellCastRequest ( SpellInfo const *  spellInfo)
2312{
2313 if (GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))
2314 return false;
2315
2316 if (GetSpellCooldownDelay(spellInfo->Id) > GetSpellQueueWindow())
2317 return false;
2318
2320 if (Spell* spell = GetCurrentSpell(spellSlot))
2321 {
2322 bool autoshot = spell->m_spellInfo->IsAutoRepeatRangedSpell();
2323 if (IsNonMeleeSpellCast(false, true, true, autoshot))
2324 return false;
2325 }
2326 return true;
2327}
CurrentSpellTypes
Definition: Unit.h:537
@ CURRENT_MELEE_SPELL
Definition: Unit.h:538
GlobalCooldownMgr & GetGlobalCooldownMgr()
Definition: Player.h:1813
uint32 GetSpellQueueWindow() const
Definition: PlayerUpdates.cpp:2306
uint32 GetSpellCooldownDelay(uint32 spell_id) const
Definition: Player.cpp:16286

References CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Unit::GetCurrentSpell(), GetGlobalCooldownMgr(), GetSpellCooldownDelay(), GetSpellQueueWindow(), SpellInfo::Id, and Unit::IsNonMeleeSpellCast().

Referenced by WorldSession::HandleCastSpellOpcode(), WorldSession::HandleUseItemOpcode(), and ProcessSpellQueue().

◆ CanFly()

bool Player::CanFly ( ) const
inlineoverridevirtual

Implements Unit.

@ MOVEMENTFLAG_CAN_FLY
Definition: UnitDefines.h:389
bool HasMovementFlag(uint32 flag) const
Definition: Object.h:340
MovementInfo m_movementInfo
Definition: Object.h:608

References MovementInfo::HasMovementFlag(), WorldObject::m_movementInfo, and MOVEMENTFLAG_CAN_FLY.

Referenced by gm_commandscript::HandleGMFlyCommand().

◆ canFlyInZone()

bool Player::canFlyInZone ( uint32  mapid,
uint32  zone,
SpellInfo const *  bySpell 
)
13590{
13591 if (!sScriptMgr->OnPlayerCanFlyInZone(this, mapid,zone,bySpell))
13592 {
13593 return false;
13594 }
13595
13596 // continent checked in SpellInfo::CheckLocation at cast and area update
13597 uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
13598 if (v_map == MAP_NORTHREND && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
13599 {
13600 if (!HasSpell(54197)) // 54197 = Cold Weather Flying
13601 {
13602 return false;
13603 }
13604 }
13605
13606 return true;
13607}
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
Definition: DBCStores.cpp:703
@ MAP_NORTHREND
Definition: AreaDefines.h:241
@ SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT
Definition: SharedDefines.h:663

References GetVirtualMapForMapAndZone(), SpellInfo::HasAttribute(), HasSpell(), MAP_NORTHREND, SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT, and sScriptMgr.

Referenced by SpellInfo::CheckLocation().

◆ CanInteractWithQuestGiver()

bool Player::CanInteractWithQuestGiver ( Object questGiver)
2066{
2067 switch (questGiver->GetTypeId())
2068 {
2069 case TYPEID_UNIT:
2070 return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != nullptr;
2071 case TYPEID_GAMEOBJECT:
2072 return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != nullptr;
2073 case TYPEID_PLAYER:
2074 return IsAlive() && questGiver->ToPlayer()->IsAlive();
2075 case TYPEID_ITEM:
2076 return IsAlive();
2077 default:
2078 break;
2079 }
2080 return false;
2081}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:316
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition: SharedDefines.h:1562
GameObject * GetGameObjectIfCanInteractWith(ObjectGuid guid, GameobjectTypes type) const
Definition: Player.cpp:2140

References GAMEOBJECT_TYPE_QUESTGIVER, GetGameObjectIfCanInteractWith(), Object::GetGUID(), GetNPCIfCanInteractWith(), Object::GetTypeId(), Unit::IsAlive(), Object::ToPlayer(), TYPEID_GAMEOBJECT, TYPEID_ITEM, TYPEID_PLAYER, TYPEID_UNIT, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), and WorldSession::HandleQuestgiverRequestRewardOpcode().

◆ CanJoinConstantChannelInZone()

bool Player::CanJoinConstantChannelInZone ( ChatChannelsEntry const *  channel,
AreaTableEntry const *  zone 
)
4983{
4984 // Player can join LFG anywhere
4985 if (channel->flags & CHANNEL_DBC_FLAG_LFG && sWorld->getBoolConfig(CONFIG_LFG_LOCATION_ALL))
4986 return true;
4987
4988 if (channel->flags & CHANNEL_DBC_FLAG_ZONE_DEP && zone->flags & AREA_FLAG_ARENA_INSTANCE)
4989 return false;
4990
4991 if ((channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY) && (!(zone->flags & AREA_FLAG_SLAVE_CAPITAL)))
4992 return false;
4993
4994 if ((channel->flags & CHANNEL_DBC_FLAG_GUILD_REQ) && GetGuildId())
4995 return false;
4996
4997 return true;
4998}
@ CONFIG_LFG_LOCATION_ALL
Definition: IWorld.h:154
@ CHANNEL_DBC_FLAG_CITY_ONLY
Definition: Channel.h:97
@ CHANNEL_DBC_FLAG_GUILD_REQ
Definition: Channel.h:100
@ CHANNEL_DBC_FLAG_ZONE_DEP
Definition: Channel.h:94
@ CHANNEL_DBC_FLAG_LFG
Definition: Channel.h:101
@ AREA_FLAG_ARENA_INSTANCE
Definition: DBCEnums.h:250
@ AREA_FLAG_SLAVE_CAPITAL
Definition: DBCEnums.h:237
uint32 GetGuildId() const
Definition: Player.h:1909

References AREA_FLAG_ARENA_INSTANCE, AREA_FLAG_SLAVE_CAPITAL, CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GUILD_REQ, CHANNEL_DBC_FLAG_LFG, CHANNEL_DBC_FLAG_ZONE_DEP, CONFIG_LFG_LOCATION_ALL, AreaTableEntry::flags, ChatChannelsEntry::flags, GetGuildId(), and sWorld.

Referenced by UpdateLocalChannels().

◆ CanJoinToBattleground()

bool Player::CanJoinToBattleground ( ) const
11308{
11309 // check Deserter debuff
11310 if (HasAura(26013))
11311 return false;
11312
11313 return true;
11314}
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5754

References Unit::HasAura().

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattleFieldPortOpcode(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ CanKnockback()

bool Player::CanKnockback ( )
inline
2509{ return m_canKnockback; }

References m_canKnockback.

◆ CanNoReagentCast()

bool Player::CanNoReagentCast ( SpellInfo const *  spellInfo) const
12512{
12513 // don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
12515 return true;
12516
12517 // Check no reagent use mask
12518 flag96 noReagentMask;
12519 noReagentMask[0] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1);
12520 noReagentMask[1] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 1);
12521 noReagentMask[2] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 2);
12522 if (spellInfo->SpellFamilyFlags & noReagentMask)
12523 return true;
12524
12525 return false;
12526}
@ PLAYER_NO_REAGENT_COST_1
Definition: UpdateFields.h:387
@ UNIT_FLAG_PREPARATION
Definition: UnitDefines.h:255
@ SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
Definition: SharedDefines.h:568

References Object::GetUInt32Value(), SpellInfo::HasAttribute(), Unit::HasUnitFlag(), PLAYER_NO_REAGENT_COST_1, SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA, SpellInfo::SpellFamilyFlags, and UNIT_FLAG_PREPARATION.

Referenced by Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), and Spell::TakeReagents().

◆ CanParry()

bool Player::CanParry ( ) const
inline

◆ CanPetResurrect()

bool Player::CanPetResurrect ( )
9175{
9176 PetStable* const petStable = GetPetStable();
9177 if (!petStable)
9178 {
9179 // No pets
9180 return false;
9181 }
9182
9183 auto const& currectPet = petStable->CurrentPet;
9184 auto const& unslottedHunterPet = petStable->GetUnslottedHunterPet();
9185
9186 if (!currectPet && !unslottedHunterPet)
9187 {
9188 // No pets
9189 return false;
9190 }
9191
9192 // Check current pet
9193 if (currectPet && !currectPet->Health)
9194 {
9195 return true;
9196 }
9197
9198 // Check dismiss/unslotted hunter pet
9199 if (unslottedHunterPet && !unslottedHunterPet->Health)
9200 {
9201 return true;
9202 }
9203
9204 return false;
9205}
Definition: PetDefines.h:206
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:234
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:229
PetStable * GetPetStable()
Definition: Player.h:1220

References PetStable::CurrentPet, GetPetStable(), and PetStable::GetUnslottedHunterPet().

◆ CanReportAfkDueToLimit()

bool Player::CanReportAfkDueToLimit ( )
11317{
11318 // a player can complain about 15 people per 5 minutes
11319 if (m_bgData.bgAfkReportedCount++ >= 15)
11320 return false;
11321
11322 return true;
11323}
uint8 bgAfkReportedCount
Definition: Player.h:1049
BGData m_bgData
Definition: Player.h:2690

References BGData::bgAfkReportedCount, and m_bgData.

Referenced by ReportedAfkBy().

◆ CanRequestSpellCast()

bool Player::CanRequestSpellCast ( SpellInfo const *  spellInfo)
2338{
2339 if (!sWorld->getBoolConfig(CONFIG_SPELL_QUEUE_ENABLED))
2340 return false;
2341
2342 // Check for existing cast request with the same category
2343 if (GetCastRequest(spellInfo->GetCategory()))
2344 return false;
2345
2346 if (GetGlobalCooldownMgr().GetGlobalCooldown(spellInfo) > GetSpellQueueWindow())
2347 return false;
2348
2349 if (GetSpellCooldownDelay(spellInfo->Id) > GetSpellQueueWindow())
2350 return false;
2351
2352 // If there is an existing cast that will last longer than the allowable
2353 // spell queue window, then we can't request a new spell cast
2355 if (Spell* spell = GetCurrentSpell(spellSlot))
2356 if (spell->GetCastTimeRemaining() > static_cast<int32>(GetSpellQueueWindow()))
2357 return false;
2358
2359 return true;
2360}
@ CONFIG_SPELL_QUEUE_ENABLED
Definition: IWorld.h:183
const PendingSpellCastRequest * GetCastRequest(uint32 category) const
Definition: PlayerUpdates.cpp:2329

References CONFIG_SPELL_QUEUE_ENABLED, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, GetCastRequest(), SpellInfo::GetCategory(), Unit::GetCurrentSpell(), GetGlobalCooldownMgr(), GetSpellCooldownDelay(), GetSpellQueueWindow(), SpellInfo::Id, and sWorld.

Referenced by WorldSession::HandleCastSpellOpcode(), and WorldSession::HandleUseItemOpcode().

◆ CanResummonPet()

bool Player::CanResummonPet ( uint32  spellid)
14198{
14200 {
14201 if (CanSeeDKPet())
14202 return true;
14203 else if (spellid == 52150) // Raise Dead
14204 return false;
14205 }
14206
14208 {
14209 if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
14210 return true;
14211 }
14212
14214 {
14215 return true;
14216 }
14217
14218 return HasSpell(spellid);
14219}
@ CLASS_CONTEXT_PET
Definition: UnitDefines.h:236
@ CLASS_MAGE
Definition: SharedDefines.h:148
bool CanSeeDKPet() const
Definition: Player.h:2606

References CanSeeDKPet(), CLASS_CONTEXT_PET, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_MAGE, Unit::HasAura(), HasSpell(), and IsClass().

Referenced by spell_gen_pet_summoned::HandleScript(), and ResummonPetTemporaryUnSummonedIfAny().

◆ CanRewardQuest() [1/2]

bool Player::CanRewardQuest ( Quest const *  quest,
bool  msg 
)
386{
387 // not auto complete quest and not completed quest (only cheating case, then ignore without message)
388 if (!quest->IsDFQuest() && !quest->IsAutoComplete() && quest->GetQuestMethod() && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE)
389 return false;
390
391 // daily quest can't be rewarded (25 daily quest already completed)
392 if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true) || !SatisfyQuestMonth(quest, true) || !SatisfyQuestSeasonal(quest, true))
393 return false;
394
395 // rewarded and not repeatable quest (only cheating case, then ignore without message)
396 if (GetQuestRewardStatus(quest->GetQuestId()))
397 return false;
398
399 // prevent receive reward with quest items in bank
400 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
401 {
402 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
403 {
404 if (quest->RequiredItemCount[i] != 0 &&
405 GetItemCount(quest->RequiredItemId[i]) < quest->RequiredItemCount[i])
406 {
407 if (msg)
408 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr, quest->RequiredItemId[i]);
409 return false;
410 }
411 }
412 }
413
414 // prevent receive reward with low money and GetRewOrReqMoney() < 0
415 if (quest->GetRewOrReqMoney() < 0 && !HasEnoughMoney(-quest->GetRewOrReqMoney()))
416 return false;
417
418 return true;
419}
bool SatisfyQuestDay(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1268
bool SatisfyQuestMonth(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1326
bool SatisfyQuestSeasonal(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1311
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: PlayerQuest.cpp:1430
bool SatisfyQuestWeek(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1302

References EQUIP_ERR_ITEM_NOT_FOUND, GetItemCount(), Quest::GetQuestId(), Quest::GetQuestMethod(), GetQuestRewardStatus(), GetQuestStatus(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), Quest::IsDFQuest(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_COMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, SatisfyQuestDay(), SatisfyQuestMonth(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), and SendEquipError().

Referenced by CanCompleteRepeatableQuest(), CanRewardQuest(), lfg::LFGMgr::FinishDungeon(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), npc_elder_clearwater::OnGossipHello(), and SendPreparedQuest().

◆ CanRewardQuest() [2/2]

bool Player::CanRewardQuest ( Quest const *  quest,
uint32  reward,
bool  msg 
)
469{
470 // prevent receive reward with quest items in bank or for not completed quest
471 if (!CanRewardQuest(quest, msg))
472 return false;
473
474 ItemPosCountVec dest;
475 if (quest->GetRewChoiceItemsCount() > 0)
476 {
477 if (quest->RewardChoiceItemId[reward])
478 {
479 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[reward], quest->RewardChoiceItemCount[reward]);
480 if (res != EQUIP_ERR_OK)
481 {
482 SendEquipError(res, nullptr, nullptr, quest->RewardChoiceItemId[reward]);
483 return false;
484 }
485 }
486 }
487
488 if (quest->GetRewItemsCount() > 0)
489 {
490 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
491 {
492 if (quest->RewardItemId[i])
493 {
494 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardItemId[i], quest->RewardItemIdCount[i]);
495 if (res != EQUIP_ERR_OK)
496 {
497 SendEquipError(res, nullptr, nullptr, quest->RewardItemId[i]);
498 return false;
499 }
500 }
501 }
502 }
503
504 return true;
505}

References CanRewardQuest(), CanStoreNewItem(), EQUIP_ERR_OK, Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), NULL_BAG, NULL_SLOT, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardItemId, Quest::RewardItemIdCount, and SendEquipError().

◆ CanRollForItemInLFG()

InventoryResult Player::CanRollForItemInLFG ( ItemTemplate const *  item,
WorldObject const *  lootedObject 
) const
2338{
2339 if (!GetGroup() || !GetGroup()->isLFGGroup(true))
2340 return EQUIP_ERR_OK; // not in LFG group
2341
2342 // check if looted object is inside the lfg dungeon
2343 Map const* map = lootedObject->GetMap();
2344 if (!sLFGMgr->inLfgDungeonMap(GetGroup()->GetGUID(), map->GetId(), map->GetDifficulty()))
2345 return EQUIP_ERR_OK;
2346
2347 if (!proto)
2349 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2350
2351 const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] =
2352 {
2358 }; //Copy from function Item::GetSkill()
2359
2360 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2362
2363 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2365
2366 if (proto->RequiredSkill != 0)
2367 {
2368 if (!GetSkillValue(proto->RequiredSkill))
2370 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2372 }
2373
2374 if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0)
2376
2377 if (proto->Class == ITEM_CLASS_ARMOR)
2378 {
2379 // Check for shields
2380 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD && !(
2384 {
2386 }
2387
2388 // Check for librams.
2390 {
2392 }
2393
2394 // CHeck for idols.
2396 {
2398 }
2399
2400 // Check for totems.
2402 {
2404 }
2405
2406 // Check for sigils.
2408 {
2410 }
2411 }
2412
2413 if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISC && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER &&
2414 proto->InventoryType != INVTYPE_CLOAK)
2415 {
2416 uint32 subclassToCompare = ITEM_SUBCLASS_ARMOR_CLOTH;
2418 {
2419 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2420 }
2422 {
2423 if ((proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat()))
2424 {
2426 }
2427 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2428 }
2430 {
2431 subclassToCompare = ITEM_SUBCLASS_ARMOR_MAIL;
2432 }
2434 {
2435 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2436 }
2438 {
2439 if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
2440 {
2442 }
2443 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2444 }
2445
2446 if (proto->SubClass > subclassToCompare)
2447 {
2449 }
2450 else if (sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION) && proto->ItemLevel > sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION))
2451 {
2452 if (proto->SubClass < subclassToCompare)
2453 {
2455 }
2456 }
2457 }
2458
2459 return EQUIP_ERR_OK;
2460}
#define sLFGMgr
Definition: LFGMgr.h:641
@ CLASS_CONTEXT_EQUIP_SHIELDS
Definition: UnitDefines.h:239
@ CLASS_CONTEXT_EQUIP_RELIC
Definition: UnitDefines.h:238
@ CLASS_CONTEXT_EQUIP_ARMOR_CLASS
Definition: UnitDefines.h:240
@ EQUIP_ERR_CANT_EQUIP_SKILL
Definition: Item.h:49
@ EQUIP_ERR_NO_REQUIRED_PROFICIENCY
Definition: Item.h:55
@ EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM
Definition: Item.h:57
@ INVTYPE_CLOAK
Definition: ItemTemplate.h:272
@ ITEM_SUBCLASS_ARMOR_BUCKLER
Definition: ItemTemplate.h:395
@ ITEM_SUBCLASS_ARMOR_LIBRAM
Definition: ItemTemplate.h:397
@ ITEM_SUBCLASS_ARMOR_MISC
Definition: ItemTemplate.h:390
@ ITEM_SUBCLASS_ARMOR_SIGIL
Definition: ItemTemplate.h:400
@ ITEM_SUBCLASS_ARMOR_TOTEM
Definition: ItemTemplate.h:399
@ ITEM_SUBCLASS_ARMOR_IDOL
Definition: ItemTemplate.h:398
#define MAX_ITEM_SUBCLASS_WEAPON
Definition: ItemTemplate.h:371
@ CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION
Definition: IWorld.h:419
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ SKILL_BOWS
Definition: SharedDefines.h:2873
@ SKILL_MACES
Definition: SharedDefines.h:2877
@ SKILL_WANDS
Definition: SharedDefines.h:2941
@ SKILL_GUNS
Definition: SharedDefines.h:2874
@ SKILL_CROSSBOWS
Definition: SharedDefines.h:2940
@ SKILL_THROWN
Definition: SharedDefines.h:2914
@ SKILL_FISHING
Definition: SharedDefines.h:2957
@ SKILL_SWORDS
Definition: SharedDefines.h:2871
@ SKILL_DAGGERS
Definition: SharedDefines.h:2913
@ SKILL_2H_AXES
Definition: SharedDefines.h:2912
@ SKILL_POLEARMS
Definition: SharedDefines.h:2942
@ SKILL_2H_SWORDS
Definition: SharedDefines.h:2878
@ SKILL_FIST_WEAPONS
Definition: SharedDefines.h:2966
@ SKILL_2H_MACES
Definition: SharedDefines.h:2906
@ SKILL_AXES
Definition: SharedDefines.h:2872
@ SKILL_STAVES
Definition: SharedDefines.h:2894
@ SKILL_ASSASSINATION
Definition: SharedDefines.h:2946
uint32 getRaceMask() const
Definition: Unit.h:788
uint32 GetId() const
Definition: Map.h:229
Difficulty GetDifficulty() const
Definition: Map.h:290

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_CONTEXT_EQUIP_RELIC, CLASS_CONTEXT_EQUIP_SHIELDS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_PALADIN, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARRIOR, CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Map::GetDifficulty(), GetGroup(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), Unit::getRaceMask(), GetSkillValue(), HasSpell(), ItemTemplate::HasSpellPowerStat(), ItemTemplate::HasStat(), ItemTemplate::InventoryType, INVTYPE_CLOAK, IsClass(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, ITEM_MOD_SPELL_POWER, ITEM_SUBCLASS_ARMOR_BUCKLER, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ItemTemplate::ItemLevel, MAX_ITEM_SUBCLASS_WEAPON, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, SKILL_2H_AXES, SKILL_2H_MACES, SKILL_2H_SWORDS, SKILL_ASSASSINATION, SKILL_AXES, SKILL_BOWS, SKILL_CROSSBOWS, SKILL_DAGGERS, SKILL_FISHING, SKILL_FIST_WEAPONS, SKILL_GUNS, SKILL_MACES, SKILL_POLEARMS, SKILL_STAVES, SKILL_SWORDS, SKILL_THROWN, SKILL_WANDS, sLFGMgr, ItemTemplate::SubClass, and sWorld.

Referenced by Group::NeedBeforeGreed().

◆ CanSeeDKPet()

bool Player::CanSeeDKPet ( ) const
inline

◆ CanSeeSpellClickOn()

bool Player::CanSeeSpellClickOn ( Creature const *  creature) const
14222{
14223 if (!c->HasNpcFlag(UNIT_NPC_FLAG_SPELLCLICK))
14224 return false;
14225
14226 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(c->GetEntry());
14227 if (clickPair.first == clickPair.second)
14228 return true;
14229
14230 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
14231 {
14232 if (!itr->second.IsFitToRequirements(this, c))
14233 return false;
14234
14235 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(c->GetEntry(), itr->second.spellId);
14236 ConditionSourceInfo info = ConditionSourceInfo(const_cast<Player*>(this), const_cast<Creature*>(c));
14237 if (sConditionMgr->IsObjectMeetToConditions(info, conds))
14238 return true;
14239 }
14240
14241 return false;
14242}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:339
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:408
Definition: ConditionMgr.h:182

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, sObjectMgr, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Unit::PatchValuesUpdate().

◆ CanSeeStartQuest()

bool Player::CanSeeStartQuest ( Quest const *  quest)
238{
239 if (!sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this) && SatisfyQuestClass(quest, false) && SatisfyQuestRace(quest, false) &&
240 SatisfyQuestSkill(quest, false) && SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
241 SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
242 SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
243 SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
244 {
245 return GetLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF) >= quest->GetMinLevel();
246 }
247
248 return false;
249}
@ CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF
Definition: IWorld.h:288
#define sDisableMgr
Definition: DisableMgr.h:88
@ DISABLE_TYPE_QUEST
Definition: DisableMgr.h:29
bool SatisfyQuestNextChain(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1220
bool SatisfyQuestExclusiveGroup(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1183
bool SatisfyQuestRace(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1103
bool SatisfyQuestClass(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1085
bool SatisfyQuestReputation(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1117
bool SatisfyQuestPreviousQuest(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:999
bool SatisfyQuestSkill(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:947
bool SatisfyQuestPrevChain(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1240

References CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF, DISABLE_TYPE_QUEST, Unit::GetLevel(), Quest::GetMinLevel(), Quest::GetQuestId(), SatisfyQuestClass(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestWeek(), sDisableMgr, and sWorld.

Referenced by npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandleQuestgiverChooseRewardOpcode(), and WorldSession::HandleQuestgiverCompleteQuest().

◆ CanSeeVendor()

bool Player::CanSeeVendor ( Creature const *  creature) const
14245{
14246 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_VENDOR))
14247 return true;
14248
14249 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), 0);
14250 if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), conditions))
14251 {
14252 return false;
14253 }
14254
14255 return true;
14256}

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, and UNIT_NPC_FLAG_VENDOR.

Referenced by Unit::PatchValuesUpdate().

◆ CanShareQuest()

bool Player::CanShareQuest ( uint32  quest_id) const
1459{
1460 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1461 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE))
1462 {
1463 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1464 if (itr != m_QuestStatus.end())
1465 {
1466 // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share
1467 if (sPoolMgr->IsPartOfAPool<Quest>(quest_id) && !sPoolMgr->IsSpawnedObject<Quest>(quest_id))
1468 {
1470 return false;
1471 }
1472
1473 return true;
1474 }
1475 }
1476 return false;
1477}
#define sPoolMgr
Definition: PoolMgr.h:163
@ QUEST_FLAGS_SHARABLE
Definition: QuestDef.h:135
@ QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY
Definition: QuestDef.h:74
void SendPushToPartyResponse(Player const *player, uint8 msg) const
Definition: PlayerQuest.cpp:2435
bool HasFlag(uint32 flag) const
Definition: QuestDef.h:221

References Quest::HasFlag(), m_QuestStatus, QUEST_FLAGS_SHARABLE, QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY, SendPushToPartyResponse(), sObjectMgr, and sPoolMgr.

Referenced by WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ CanSpeak()

bool Player::CanSpeak ( ) const
70{
71 return GetSession()->m_muteTime <= time (nullptr);
72}
time_t m_muteTime
Definition: WorldSession.h:508

References GetSession(), and WorldSession::m_muteTime.

Referenced by WorldSession::HandleMessagechatOpcode(), and misc_commandscript::HandleUnmuteCommand().

◆ CanStoreItem() [1/2]

◆ CanStoreItem() [2/2]

InventoryResult Player::CanStoreItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
uint32  entry,
uint32  count,
Item pItem = nullptr,
bool  swap = false,
uint32 no_space_count = nullptr 
) const
1102{
1103 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, entry, count);
1104
1105 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
1106 if (!pProto)
1107 {
1108 if (no_space_count)
1109 *no_space_count = count;
1111 }
1112
1113 if (pItem)
1114 {
1115 // you bad chet0rz, wpe pro
1116 if (bag == NULL_BAG && slot == NULL_SLOT)
1117 if (pItem->IsBag() && pItem->IsNotEmptyBag())
1119
1120 // Xinef: Removed next loot generated check
1121 if (pItem->GetGUID() == GetLootGUID())
1122 {
1123 if (no_space_count)
1124 *no_space_count = count;
1126 }
1127
1128 if (pItem->IsBindedNotWith(this))
1129 {
1130 if (no_space_count)
1131 *no_space_count = count;
1133 }
1134 }
1135
1136 // check count of items (skip for auto move for same player from bank)
1137 uint32 no_similar_count = 0; // can't store this amount similar items
1138 InventoryResult res = CanTakeMoreSimilarItems(entry, count, pItem, &no_similar_count);
1139 if (res != EQUIP_ERR_OK)
1140 {
1141 if (count == no_similar_count)
1142 {
1143 if (no_space_count)
1144 *no_space_count = no_similar_count;
1145 return res;
1146 }
1147 count -= no_similar_count;
1148 }
1149
1150 // in specific slot
1151 if (bag != NULL_BAG && slot != NULL_SLOT)
1152 {
1153 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
1154 if (res != EQUIP_ERR_OK)
1155 {
1156 if (no_space_count)
1157 *no_space_count = count + no_similar_count;
1158 return res;
1159 }
1160
1161 if (count == 0)
1162 {
1163 if (no_similar_count == 0)
1164 return EQUIP_ERR_OK;
1165
1166 if (no_space_count)
1167 *no_space_count = count + no_similar_count;
1169 }
1170 }
1171
1172 // not specific slot or have space for partly store only in specific slot
1173
1174 // in specific bag
1175 if (bag != NULL_BAG)
1176 {
1177 // search stack in bag for merge to
1178 if (pProto->Stackable != 1)
1179 {
1180 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1181 {
1182 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1183 if (res != EQUIP_ERR_OK)
1184 {
1185 if (no_space_count)
1186 *no_space_count = count + no_similar_count;
1187 return res;
1188 }
1189
1190 if (count == 0)
1191 {
1192 if (no_similar_count == 0)
1193 return EQUIP_ERR_OK;
1194
1195 if (no_space_count)
1196 *no_space_count = count + no_similar_count;
1198 }
1199
1200 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1201 if (res != EQUIP_ERR_OK)
1202 {
1203 if (no_space_count)
1204 *no_space_count = count + no_similar_count;
1205 return res;
1206 }
1207
1208 if (count == 0)
1209 {
1210 if (no_similar_count == 0)
1211 return EQUIP_ERR_OK;
1212
1213 if (no_space_count)
1214 *no_space_count = count + no_similar_count;
1216 }
1217 }
1218 else // equipped bag
1219 {
1220 // we need check 2 time (specialized/non_specialized), use NULL_BAG to prevent skipping bag
1221 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
1222 if (res != EQUIP_ERR_OK)
1223 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
1224
1225 if (res != EQUIP_ERR_OK)
1226 {
1227 if (no_space_count)
1228 *no_space_count = count + no_similar_count;
1229 return res;
1230 }
1231
1232 if (count == 0)
1233 {
1234 if (no_similar_count == 0)
1235 return EQUIP_ERR_OK;
1236
1237 if (no_space_count)
1238 *no_space_count = count + no_similar_count;
1240 }
1241 }
1242 }
1243
1244 // search free slot in bag for place to
1245 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1246 {
1247 // search free slot - keyring case
1248 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1249 {
1250 uint32 keyringSize = GetMaxKeyringSize();
1251 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1252 if (res != EQUIP_ERR_OK)
1253 {
1254 if (no_space_count)
1255 *no_space_count = count + no_similar_count;
1256 return res;
1257 }
1258
1259 if (count == 0)
1260 {
1261 if (no_similar_count == 0)
1262 return EQUIP_ERR_OK;
1263
1264 if (no_space_count)
1265 *no_space_count = count + no_similar_count;
1267 }
1268
1269 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1270 if (res != EQUIP_ERR_OK)
1271 {
1272 if (no_space_count)
1273 *no_space_count = count + no_similar_count;
1274 return res;
1275 }
1276
1277 if (count == 0)
1278 {
1279 if (no_similar_count == 0)
1280 return EQUIP_ERR_OK;
1281
1282 if (no_space_count)
1283 *no_space_count = count + no_similar_count;
1285 }
1286 }
1287 else if (pProto->IsCurrencyToken())
1288 {
1289 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1290 if (res != EQUIP_ERR_OK)
1291 {
1292 if (no_space_count)
1293 *no_space_count = count + no_similar_count;
1294 return res;
1295 }
1296
1297 if (count == 0)
1298 {
1299 if (no_similar_count == 0)
1300 return EQUIP_ERR_OK;
1301
1302 if (no_space_count)
1303 *no_space_count = count + no_similar_count;
1305 }
1306 }
1307
1308 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1309 if (res != EQUIP_ERR_OK)
1310 {
1311 if (no_space_count)
1312 *no_space_count = count + no_similar_count;
1313 return res;
1314 }
1315
1316 if (count == 0)
1317 {
1318 if (no_similar_count == 0)
1319 return EQUIP_ERR_OK;
1320
1321 if (no_space_count)
1322 *no_space_count = count + no_similar_count;
1324 }
1325 }
1326 else // equipped bag
1327 {
1328 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
1329 if (res != EQUIP_ERR_OK)
1330 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
1331
1332 if (res != EQUIP_ERR_OK)
1333 {
1334 if (no_space_count)
1335 *no_space_count = count + no_similar_count;
1336 return res;
1337 }
1338
1339 if (count == 0)
1340 {
1341 if (no_similar_count == 0)
1342 return EQUIP_ERR_OK;
1343
1344 if (no_space_count)
1345 *no_space_count = count + no_similar_count;
1347 }
1348 }
1349 }
1350
1351 // not specific bag or have space for partly store only in specific bag
1352
1353 // search stack for merge to
1354 if (pProto->Stackable != 1)
1355 {
1356 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1357 if (res != EQUIP_ERR_OK)
1358 {
1359 if (no_space_count)
1360 *no_space_count = count + no_similar_count;
1361 return res;
1362 }
1363
1364 if (count == 0)
1365 {
1366 if (no_similar_count == 0)
1367 return EQUIP_ERR_OK;
1368
1369 if (no_space_count)
1370 *no_space_count = count + no_similar_count;
1372 }
1373
1374 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1375 if (res != EQUIP_ERR_OK)
1376 {
1377 if (no_space_count)
1378 *no_space_count = count + no_similar_count;
1379 return res;
1380 }
1381
1382 if (count == 0)
1383 {
1384 if (no_similar_count == 0)
1385 return EQUIP_ERR_OK;
1386
1387 if (no_space_count)
1388 *no_space_count = count + no_similar_count;
1390 }
1391
1392 if (pProto->BagFamily)
1393 {
1395 {
1396 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
1397 if (res != EQUIP_ERR_OK)
1398 continue;
1399
1400 if (count == 0)
1401 {
1402 if (no_similar_count == 0)
1403 return EQUIP_ERR_OK;
1404
1405 if (no_space_count)
1406 *no_space_count = count + no_similar_count;
1408 }
1409 }
1410 }
1411
1413 {
1414 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
1415 if (res != EQUIP_ERR_OK)
1416 continue;
1417
1418 if (count == 0)
1419 {
1420 if (no_similar_count == 0)
1421 return EQUIP_ERR_OK;
1422
1423 if (no_space_count)
1424 *no_space_count = count + no_similar_count;
1426 }
1427 }
1428 }
1429
1430 // search free slot - special bag case
1431 if (pProto->BagFamily)
1432 {
1433 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1434 {
1435 uint32 keyringSize = GetMaxKeyringSize();
1436 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1437 if (res != EQUIP_ERR_OK)
1438 {
1439 if (no_space_count)
1440 *no_space_count = count + no_similar_count;
1441 return res;
1442 }
1443
1444 if (count == 0)
1445 {
1446 if (no_similar_count == 0)
1447 return EQUIP_ERR_OK;
1448
1449 if (no_space_count)
1450 *no_space_count = count + no_similar_count;
1452 }
1453 }
1454 else if (pProto->IsCurrencyToken())
1455 {
1456 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1457 if (res != EQUIP_ERR_OK)
1458 {
1459 if (no_space_count)
1460 *no_space_count = count + no_similar_count;
1461 return res;
1462 }
1463
1464 if (count == 0)
1465 {
1466 if (no_similar_count == 0)
1467 return EQUIP_ERR_OK;
1468
1469 if (no_space_count)
1470 *no_space_count = count + no_similar_count;
1472 }
1473 }
1474
1476 {
1477 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
1478 if (res != EQUIP_ERR_OK)
1479 continue;
1480
1481 if (count == 0)
1482 {
1483 if (no_similar_count == 0)
1484 return EQUIP_ERR_OK;
1485
1486 if (no_space_count)
1487 *no_space_count = count + no_similar_count;
1489 }
1490 }
1491 }
1492
1493 if (pItem && pItem->IsNotEmptyBag())
1495
1496 // search free slot
1497 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1498 if (res != EQUIP_ERR_OK)
1499 {
1500 if (no_space_count)
1501 *no_space_count = count + no_similar_count;
1502 return res;
1503 }
1504
1505 if (count == 0)
1506 {
1507 if (no_similar_count == 0)
1508 return EQUIP_ERR_OK;
1509
1510 if (no_space_count)
1511 *no_space_count = count + no_similar_count;
1513 }
1514
1516 {
1517 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
1518 if (res != EQUIP_ERR_OK)
1519 continue;
1520
1521 if (count == 0)
1522 {
1523 if (no_similar_count == 0)
1524 return EQUIP_ERR_OK;
1525
1526 if (no_space_count)
1527 *no_space_count = count + no_similar_count;
1529 }
1530 }
1531
1532 if (no_space_count)
1533 *no_space_count = count + no_similar_count;
1534
1536}
@ INVENTORY_SLOT_ITEM_START
Definition: Player.h:711
@ INVENTORY_SLOT_ITEM_END
Definition: Player.h:712
@ EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS
Definition: Item.h:78
@ BAG_FAMILY_MASK_KEYS
Definition: ItemTemplate.h:235
bool IsCurrencyToken() const
Definition: ItemTemplate.h:727
uint32 GetMaxKeyringSize() const
Definition: Player.h:1366

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, Object::GetGUID(), GetLootGUID(), GetMaxKeyringSize(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBag(), Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsNotEmptyBag(), KEYRING_SLOT_START, LOG_DEBUG, NULL_BAG, NULL_SLOT, sObjectMgr, and ItemTemplate::Stackable.

◆ CanStoreItem_InBag()

InventoryResult Player::CanStoreItem_InBag ( uint8  bag,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
bool  non_specialized,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
981{
982 // skip specific bag already processed in first called CanStoreItem_InBag
983 if (bag == skip_bag)
985
986 // skip not existed bag or self targeted bag
987 Bag* pBag = GetBagByPos(bag);
988 if (!pBag || pBag == pSrcItem || (pSrcItem && (pSrcItem->GetGUID() == pBag->GetGUID())))
990
991 if (pSrcItem && pSrcItem->IsNotEmptyBag())
993
994 ItemTemplate const* pBagProto = pBag->GetTemplate();
995 if (!pBagProto)
997
998 // specialized bag mode or non-specilized
999 if (non_specialized != (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER))
1001
1002 if (!ItemCanGoIntoBag(pProto, pBagProto))
1004
1005 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1006 {
1007 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1008 if (j == skip_slot)
1009 continue;
1010
1011 Item* pItem2 = GetItemByPos(bag, j);
1012
1013 // ignore move item (this slot will be empty at move)
1014 if (pItem2 == pSrcItem)
1015 pItem2 = nullptr;
1016
1017 // if merge skip empty, if !merge skip non-empty
1018 if ((pItem2 != nullptr) != merge)
1019 continue;
1020
1021 uint32 need_space = pProto->GetMaxStackSize();
1022
1023 if (pItem2)
1024 {
1025 // can be merged at least partly
1026 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1027 if (res != EQUIP_ERR_OK)
1028 continue;
1029
1030 // descrease at current stacksize
1031 need_space -= pItem2->GetCount();
1032 }
1033
1034 if (need_space > count)
1035 need_space = count;
1036
1037 ItemPosCount newPosition = ItemPosCount((bag << 8) | j, need_space);
1038 if (!newPosition.isContainedIn(dest))
1039 {
1040 dest.push_back(newPosition);
1041 count -= need_space;
1042
1043 if (count == 0)
1044 return EQUIP_ERR_OK;
1045 }
1046 }
1047 return EQUIP_ERR_OK;
1048}
@ EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG
Definition: Item.h:62
@ ITEM_SUBCLASS_CONTAINER
Definition: ItemTemplate.h:329
@ ITEM_CLASS_CONTAINER
Definition: ItemTemplate.h:292
bool ItemCanGoIntoBag(ItemTemplate const *pProto, ItemTemplate const *pBagProto)
Definition: Item.cpp:176
uint32 GetBagSize() const
Definition: Bag.h:48
InventoryResult CanBeMergedPartlyWith(ItemTemplate const *proto) const
Definition: Item.cpp:867
Definition: Player.h:771
bool isContainedIn(std::vector< ItemPosCount > const &vec) const
Definition: Player.cpp:13093

References Item::CanBeMergedPartlyWith(), ItemTemplate::Class, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Bag::GetBagSize(), Item::GetCount(), Object::GetGUID(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), ItemPosCount::isContainedIn(), Item::IsNotEmptyBag(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), and ItemTemplate::SubClass.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InInventorySlots()

InventoryResult Player::CanStoreItem_InInventorySlots ( uint8  slot_begin,
uint8  slot_end,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
1051{
1052 //this is never called for non-bag slots so we can do this
1053 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1055
1056 for (uint32 j = slot_begin; j < slot_end; j++)
1057 {
1058 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1059 if (INVENTORY_SLOT_BAG_0 == skip_bag && j == skip_slot)
1060 continue;
1061
1063
1064 // ignore move item (this slot will be empty at move)
1065 if (pItem2 == pSrcItem)
1066 pItem2 = nullptr;
1067
1068 // if merge skip empty, if !merge skip non-empty
1069 if ((pItem2 != nullptr) != merge)
1070 continue;
1071
1072 uint32 need_space = pProto->GetMaxStackSize();
1073
1074 if (pItem2)
1075 {
1076 // can be merged at least partly
1077 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1078 if (res != EQUIP_ERR_OK)
1079 continue;
1080
1081 // descrease at current stacksize
1082 need_space -= pItem2->GetCount();
1083 }
1084
1085 if (need_space > count)
1086 need_space = count;
1087
1088 ItemPosCount newPosition = ItemPosCount((INVENTORY_SLOT_BAG_0 << 8) | j, need_space);
1089 if (!newPosition.isContainedIn(dest))
1090 {
1091 dest.push_back(newPosition);
1092 count -= need_space;
1093
1094 if (count == 0)
1095 return EQUIP_ERR_OK;
1096 }
1097 }
1098 return EQUIP_ERR_OK;
1099}

References Item::CanBeMergedPartlyWith(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_OK, Item::GetCount(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), and Item::IsNotEmptyBag().

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InSpecificSlot()

InventoryResult Player::CanStoreItem_InSpecificSlot ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  swap,
Item pSrcItem 
) const
private
910{
911 Item* pItem2 = GetItemByPos(bag, slot);
912
913 // ignore move item (this slot will be empty at move)
914 if (pItem2 == pSrcItem)
915 pItem2 = nullptr;
916
917 uint32 need_space;
918
919 // empty specific slot - check item fit to slot
920 if (!pItem2 || swap)
921 {
922 if (bag == INVENTORY_SLOT_BAG_0)
923 {
924 // keyring case
925 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START + GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
927
928 // currencytoken case
929 if (slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->IsCurrencyToken()))
931
932 // prevent cheating
933 if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END)
935 }
936 else
937 {
938 Bag* pBag = GetBagByPos(bag);
939 if (!pBag)
941
942 ItemTemplate const* pBagProto = pBag->GetTemplate();
943 if (!pBagProto)
945
946 if (slot >= pBagProto->ContainerSlots)
948
949 if (!ItemCanGoIntoBag(pProto, pBagProto))
951 }
952
953 // non empty stack with space
954 need_space = pProto->GetMaxStackSize();
955 }
956 // non empty slot, check item type
957 else
958 {
959 // can be merged at least partly
960 InventoryResult res = pItem2->CanBeMergedPartlyWith(pProto);
961 if (res != EQUIP_ERR_OK)
962 return res;
963
964 // free stack space or infinity
965 need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
966 }
967
968 if (need_space > count)
969 need_space = count;
970
971 ItemPosCount newPosition = ItemPosCount((bag << 8) | slot, need_space);
972 if (!newPosition.isContainedIn(dest))
973 {
974 dest.push_back(newPosition);
975 count -= need_space;
976 }
977 return EQUIP_ERR_OK;
978}
uint32 ContainerSlots
Definition: ItemTemplate.h:646

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, BUYBACK_SLOT_END, BUYBACK_SLOT_START, Item::CanBeMergedPartlyWith(), ItemTemplate::ContainerSlots, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), GetItemByPos(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), ItemTemplate::IsCurrencyToken(), ItemCanGoIntoBag(), KEYRING_SLOT_START, and PLAYER_SLOT_END.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItems()

InventoryResult Player::CanStoreItems ( Item **  pItem,
int32  count 
) const
1540{
1541 Item* pItem2;
1542
1543 // fill space table
1546 int inv_keys[KEYRING_SLOT_END - KEYRING_SLOT_START];
1548
1549 memset(inv_slot_items, 0, sizeof(int) * (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START));
1550 memset(inv_bags, 0, sizeof(int) * (INVENTORY_SLOT_BAG_END - INVENTORY_SLOT_BAG_START) * MAX_BAG_SIZE);
1551 memset(inv_keys, 0, sizeof(int) * (KEYRING_SLOT_END - KEYRING_SLOT_START));
1552 memset(inv_tokens, 0, sizeof(int) * (CURRENCYTOKEN_SLOT_END - CURRENCYTOKEN_SLOT_START));
1553
1555 {
1557 if (pItem2 && !pItem2->IsInTrade())
1558 inv_slot_items[i - INVENTORY_SLOT_ITEM_START] = pItem2->GetCount();
1559 }
1560
1561 for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
1562 {
1564 if (pItem2 && !pItem2->IsInTrade())
1565 inv_keys[i - KEYRING_SLOT_START] = pItem2->GetCount();
1566 }
1567
1569 {
1571 if (pItem2 && !pItem2->IsInTrade())
1572 inv_tokens[i - CURRENCYTOKEN_SLOT_START] = pItem2->GetCount();
1573 }
1574
1576 if (Bag* pBag = GetBagByPos(i))
1577 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1578 {
1579 pItem2 = GetItemByPos(i, j);
1580 if (pItem2 && !pItem2->IsInTrade())
1581 inv_bags[i - INVENTORY_SLOT_BAG_START][j] = pItem2->GetCount();
1582 }
1583
1584 // check free space for all items
1585 for (int k = 0; k < count; ++k)
1586 {
1587 Item* pItem = pItems[k];
1588
1589 // no item
1590 if (!pItem)
1591 continue;
1592
1593 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItems {}. item = {}, count = {}", k + 1, pItem->GetEntry(), pItem->GetCount());
1594 ItemTemplate const* pProto = pItem->GetTemplate();
1595
1596 // strange item
1597 if (!pProto)
1599
1600 // Xinef: Removed next loot generated check
1601 if (pItem->GetGUID() == GetLootGUID())
1603
1604 // item it 'bind'
1605 if (pItem->IsBindedNotWith(this))
1607
1608 ItemTemplate const* pBagProto;
1609
1610 // item is 'one item only'
1612 if (res != EQUIP_ERR_OK)
1613 return res;
1614
1615 // search stack for merge to
1616 if (pProto->Stackable != 1)
1617 {
1618 bool b_found = false;
1619
1620 for (uint8 t = KEYRING_SLOT_START; t < KEYRING_SLOT_END; ++t)
1621 {
1623 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_keys[t - KEYRING_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1624 {
1625 inv_keys[t - KEYRING_SLOT_START] += pItem->GetCount();
1626 b_found = true;
1627 break;
1628 }
1629 }
1630 if (b_found)
1631 continue;
1632
1633 for (int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; ++t)
1634 {
1636 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_tokens[t - CURRENCYTOKEN_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1637 {
1638 inv_tokens[t - CURRENCYTOKEN_SLOT_START] += pItem->GetCount();
1639 b_found = true;
1640 break;
1641 }
1642 }
1643 if (b_found)
1644 continue;
1645
1647 {
1649 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_slot_items[t - INVENTORY_SLOT_ITEM_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1650 {
1651 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] += pItem->GetCount();
1652 b_found = true;
1653 break;
1654 }
1655 }
1656 if (b_found)
1657 continue;
1658
1659 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1660 {
1661 if (Bag* bag = GetBagByPos(t))
1662 {
1663 if (ItemCanGoIntoBag(pItem->GetTemplate(), bag->GetTemplate()))
1664 {
1665 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1666 {
1667 pItem2 = GetItemByPos(t, j);
1668 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_bags[t - INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->GetMaxStackSize())
1669 {
1670 inv_bags[t - INVENTORY_SLOT_BAG_START][j] += pItem->GetCount();
1671 b_found = true;
1672 break;
1673 }
1674 }
1675 }
1676 }
1677 }
1678 if (b_found)
1679 continue;
1680 }
1681
1682 // special bag case
1683 if (pProto->BagFamily)
1684 {
1685 bool b_found = false;
1686 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1687 {
1688 uint32 keyringSize = GetMaxKeyringSize();
1689 for (uint32 t = KEYRING_SLOT_START; t < KEYRING_SLOT_START + keyringSize; ++t)
1690 {
1691 if (inv_keys[t - KEYRING_SLOT_START] == 0)
1692 {
1693 inv_keys[t - KEYRING_SLOT_START] = 1;
1694 b_found = true;
1695 break;
1696 }
1697 }
1698 }
1699
1700 if (b_found)
1701 continue;
1702
1703 if (pProto->IsCurrencyToken())
1704 {
1706 {
1707 if (inv_tokens[t - CURRENCYTOKEN_SLOT_START] == 0)
1708 {
1709 inv_tokens[t - CURRENCYTOKEN_SLOT_START] = 1;
1710 b_found = true;
1711 break;
1712 }
1713 }
1714 }
1715
1716 if (b_found)
1717 continue;
1718
1719 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1720 {
1721 if (Bag* bag = GetBagByPos(t))
1722 {
1723 pBagProto = bag->GetTemplate();
1724
1725 // not plain container check
1726 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER) &&
1727 ItemCanGoIntoBag(pProto, pBagProto))
1728 {
1729 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1730 {
1731 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1732 {
1733 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1734 b_found = true;
1735 break;
1736 }
1737 }
1738 }
1739 }
1740 }
1741 if (b_found)
1742 continue;
1743 }
1744
1745 // search free slot
1746 bool b_found = false;
1748 {
1749 if (inv_slot_items[t - INVENTORY_SLOT_ITEM_START] == 0)
1750 {
1751 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] = 1;
1752 b_found = true;
1753 break;
1754 }
1755 }
1756 if (b_found)
1757 continue;
1758
1759 // search free slot in bags
1760 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1761 {
1762 if (Bag* bag = GetBagByPos(t))
1763 {
1764 pBagProto = bag->GetTemplate();
1765
1766 // special bag already checked
1767 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER))
1768 continue;
1769
1770 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1771 {
1772 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1773 {
1774 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1775 b_found = true;
1776 break;
1777 }
1778 }
1779 }
1780 }
1781
1782 // no free slot found?
1783 if (!b_found)
1785 }
1786
1787 return EQUIP_ERR_OK;
1788}
@ KEYRING_SLOT_END
Definition: Player.h:737
bool IsInTrade() const
Definition: Item.h:260

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, Item::CanBeMergedPartlyWith(), CanTakeMoreSimilarItems(), ItemTemplate::Class, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetLootGUID(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsInTrade(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), KEYRING_SLOT_END, KEYRING_SLOT_START, LOG_DEBUG, MAX_BAG_SIZE, ItemTemplate::Stackable, and ItemTemplate::SubClass.

Referenced by WorldSession::HandleAcceptTradeOpcode().

◆ CanStoreNewItem()

◆ CanTakeMoreSimilarItems() [1/3]

InventoryResult Player::CanTakeMoreSimilarItems ( Item pItem) const
inline

◆ CanTakeMoreSimilarItems() [2/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count 
) const
inline
1291{ return CanTakeMoreSimilarItems(entry, count, nullptr); }

References CanTakeMoreSimilarItems().

Referenced by CanTakeMoreSimilarItems().

◆ CanTakeMoreSimilarItems() [3/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count,
Item pItem,
uint32 no_space_count = nullptr 
) const
801{
802 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
803 if (!pProto)
804 {
805 if (no_space_count)
806 *no_space_count = count;
808 }
809
810 // no maximum
811 if ((pProto->MaxCount <= 0 && pProto->ItemLimitCategory == 0) || pProto->MaxCount == 2147483647)
812 return EQUIP_ERR_OK;
813
814 if (pProto->MaxCount > 0)
815 {
816 uint32 curcount = GetItemCount(pProto->ItemId, true, pItem);
817 if (curcount + count > uint32(pProto->MaxCount))
818 {
819 if (no_space_count)
820 *no_space_count = count + curcount - pProto->MaxCount;
822 }
823 }
824
825 // check unique-equipped limit
826 if (pProto->ItemLimitCategory)
827 {
828 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(pProto->ItemLimitCategory);
829 if (!limitEntry)
830 {
831 if (no_space_count)
832 *no_space_count = count;
834 }
835
836 if (limitEntry->mode == ITEM_LIMIT_CATEGORY_MODE_HAVE)
837 {
838 uint32 curcount = GetItemCountWithLimitCategory(pProto->ItemLimitCategory, pItem);
839 if (curcount + count > uint32(limitEntry->maxCount))
840 {
841 if (no_space_count)
842 *no_space_count = count + curcount - limitEntry->maxCount;
844 }
845 }
846 }
847
848 return EQUIP_ERR_OK;
849}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED
Definition: Item.h:130
@ ITEM_LIMIT_CATEGORY_MODE_HAVE
Definition: DBCEnums.h:379
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:372
uint32 mode
Definition: DBCStructure.h:1202

References EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_OK, GetItemCount(), GetItemCountWithLimitCategory(), ITEM_LIMIT_CATEGORY_MODE_HAVE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemTemplate::MaxCount, ItemLimitCategoryEntry::maxCount, ItemLimitCategoryEntry::mode, sItemLimitCategoryStore, and sObjectMgr.

◆ CanTakeQuest()

bool Player::CanTakeQuest ( Quest const *  quest,
bool  msg 
)
252{
253 return !sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
254 && SatisfyQuestStatus(quest, msg) && SatisfyQuestExclusiveGroup(quest, msg)
255 && SatisfyQuestClass(quest, msg) && SatisfyQuestRace(quest, msg) && SatisfyQuestLevel(quest, msg)
256 && SatisfyQuestSkill(quest, msg) && SatisfyQuestReputation(quest, msg)
257 && SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
258 && SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
259 && SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
260 && SatisfyQuestMonth(quest, msg) && SatisfyQuestSeasonal(quest, msg)
261 && SatisfyQuestConditions(quest, msg);
262}
bool SatisfyQuestConditions(Quest const *qInfo, bool msg)
Definition: PlayerQuest.cpp:1159
bool SatisfyQuestTimed(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1172
bool SatisfyQuestLevel(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:967
bool SatisfyQuestStatus(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1148

References DISABLE_TYPE_QUEST, Quest::GetQuestId(), SatisfyQuestClass(), SatisfyQuestConditions(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestLevel(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestStatus(), SatisfyQuestTimed(), SatisfyQuestWeek(), and sDisableMgr.

Referenced by CanCompleteQuest(), CanCompleteRepeatableQuest(), Spell::EffectQuestComplete(), Spell::EffectQuestStart(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), npc_wg_quest_giver::OnGossipHello(), PrepareQuestMenu(), SendPreparedQuest(), and npc_costumed_orphan_matron::sGossipHello().

◆ CanTameExoticPets()

bool Player::CanTameExoticPets ( ) const
inline

◆ CanTeleport()

bool Player::CanTeleport ( )
inline
2507{ return m_canTeleport; }

References m_canTeleport.

◆ CanTitanGrip()

bool Player::CanTitanGrip ( ) const
inline

◆ CanUnequipItem()

InventoryResult Player::CanUnequipItem ( uint16  src,
bool  swap 
) const
1985{
1986 if (!sScriptMgr->OnPlayerCanUnequipItem(const_cast<Player*>(this), pos, swap))
1988
1989 // Applied only to equipped items and bank bags
1990 if (!IsEquipmentPos(pos) && !IsBagPos(pos))
1991 return EQUIP_ERR_OK;
1992
1993 Item* pItem = GetItemByPos(pos);
1994
1995 // Applied only to existed equipped item
1996 if (!pItem)
1997 return EQUIP_ERR_OK;
1998
1999 LOG_DEBUG("entities.player.items", "STORAGE: CanUnequipItem slot = {}, item = {}, count = {}", pos, pItem->GetEntry(), pItem->GetCount());
2000
2001 ItemTemplate const* pProto = pItem->GetTemplate();
2002 if (!pProto)
2004
2005 // item used
2006 if (pItem->m_lootGenerated)
2008
2009 // do not allow unequipping gear except weapons, offhands, projectiles, relics in
2010 // - combat
2011 // - in-progress arenas
2012 if (!pProto->CanChangeEquipStateInCombat())
2013 {
2014 if (IsInCombat())
2016
2017 if (Battleground* bg = GetBattleground())
2018 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
2020 }
2021
2022 // Xinef: dont allow to unequip items on disarmed slot
2025
2026 if (!swap && pItem->IsNotEmptyBag())
2028
2029 return EQUIP_ERR_OK;
2030}

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanUseAttackType(), EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Item::GetSlot(), Item::GetTemplate(), IsBagPos(), IsEquipmentPos(), Unit::IsInCombat(), Item::IsNotEmptyBag(), LOG_DEBUG, Item::m_lootGenerated, sScriptMgr, and STATUS_IN_PROGRESS.

Referenced by CanEquipItem(), CanUnequipItems(), DestroyItemCount(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), and SwapItem().

◆ CanUnequipItems()

InventoryResult Player::CanUnequipItems ( uint32  item,
uint32  count 
) const
274{
275 uint32 tempcount = 0;
276
278
280 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
281 if (pItem->GetEntry() == item)
282 {
284 if (ires == EQUIP_ERR_OK)
285 {
286 tempcount += pItem->GetCount();
287 if (tempcount >= count)
288 return EQUIP_ERR_OK;
289 }
290 else
291 res = ires;
292 }
293
295 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
296 if (pItem->GetEntry() == item)
297 {
298 tempcount += pItem->GetCount();
299 if (tempcount >= count)
300 return EQUIP_ERR_OK;
301 }
302
304 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
305 if (pItem->GetEntry() == item)
306 {
307 tempcount += pItem->GetCount();
308 if (tempcount >= count)
309 return EQUIP_ERR_OK;
310 }
311
313 if (Bag* pBag = GetBagByPos(i))
314 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
315 if (Item* pItem = GetItemByPos(i, j))
316 if (pItem->GetEntry() == item)
317 {
318 tempcount += pItem->GetCount();
319 if (tempcount >= count)
320 return EQUIP_ERR_OK;
321 }
322
323 // not found req. item count and have unequippable items
324 return res;
325}
@ EQUIPMENT_SLOT_START
Definition: Player.h:680

References CanUnequipItem(), CURRENCYTOKEN_SLOT_END, EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by TakeQuestSourceItem().

◆ CanUninviteFromGroup()

PartyResult Player::CanUninviteFromGroup ( ObjectGuid  targetPlayerGUID = ObjectGuid::Empty) const
Todo:
: Should also be sent when anyone has recently left combat, with an aprox ~5 seconds timer.
12956{
12957 Group const* grp = GetGroup();
12958 if (!grp)
12959 return ERR_NOT_IN_GROUP;
12960
12961 if (grp->isLFGGroup(true))
12962 {
12963 ObjectGuid gguid = grp->GetGUID();
12964 if (!sLFGMgr->GetKicksLeft(gguid))
12966
12967 lfg::LfgState state = sLFGMgr->GetState(gguid);
12968 if (state == lfg::LFG_STATE_BOOT)
12970
12973
12976
12977 if (grp->isRollLootActive())
12979
12981 for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
12982 if (itr->GetSource() && itr->GetSource()->IsInMap(this) && itr->GetSource()->IsInCombat())
12984
12985 if (Player* target = ObjectAccessor::FindConnectedPlayer(targetPlayerGUID))
12986 {
12987 if (Aura* dungeonCooldownAura = target->GetAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN))
12988 {
12989 int32 elapsedTime = dungeonCooldownAura->GetMaxDuration() - dungeonCooldownAura->GetDuration();
12990 if (static_cast<int32>(sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER)) > elapsedTime)
12991 {
12993 }
12994 }
12995 }
12996
12997 /* Missing support for these types
12998 return ERR_PARTY_LFG_BOOT_COOLDOWN_S;
12999 */
13000 }
13001 else
13002 {
13003 if (!grp->IsLeader(GetGUID()) && !grp->IsAssistant(GetGUID()))
13004 return ERR_NOT_LEADER;
13005
13006 if (InBattleground())
13007 return ERR_INVITE_RESTRICTED;
13008 }
13009
13010 return ERR_PARTY_RESULT_OK;
13011}
@ CONFIG_LFG_KICK_PREVENTION_TIMER
Definition: IWorld.h:421
@ ERR_PARTY_LFG_BOOT_LOOT_ROLLS
Definition: SharedDefines.h:3748
@ ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S
Definition: SharedDefines.h:3743
@ ERR_PARTY_LFG_BOOT_LIMIT
Definition: SharedDefines.h:3739
@ ERR_NOT_LEADER
Definition: SharedDefines.h:3728
@ ERR_NOT_IN_GROUP
Definition: SharedDefines.h:3727
@ ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE
Definition: SharedDefines.h:3747
@ ERR_PARTY_LFG_BOOT_IN_COMBAT
Definition: SharedDefines.h:3745
@ ERR_PARTY_LFG_BOOT_IN_PROGRESS
Definition: SharedDefines.h:3741
@ ERR_INVITE_RESTRICTED
Definition: SharedDefines.h:3732
@ ERR_PARTY_RESULT_OK
Definition: SharedDefines.h:3721
@ ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS
Definition: SharedDefines.h:3742
LfgState
Definition: LFG.h:67
@ LFG_STATE_FINISHED_DUNGEON
Definition: LFG.h:74
@ LFG_STATE_BOOT
Definition: LFG.h:72
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition: LFGMgr.h:52
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition: LFGMgr.h:55
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:257
bool InBattleground() const
Definition: Player.h:2262
bool isLFGGroup(bool restricted=false) const
Definition: Group.cpp:2264
bool IsAssistant(ObjectGuid guid) const
Definition: Group.cpp:2354
bool isRollLootActive() const
Definition: Group.cpp:2457
bool IsLeader(ObjectGuid guid) const
Definition: Group.cpp:2340
ObjectGuid GetGUID() const
Definition: Group.cpp:2305
uint32 GetMembersCount() const
Definition: Group.h:245
GroupReference * GetFirstMember()
Definition: Group.h:243
Definition: GroupReference.h:27
GroupReference * next()
Definition: GroupReference.h:36

References CONFIG_LFG_KICK_PREVENTION_TIMER, ERR_INVITE_RESTRICTED, ERR_NOT_IN_GROUP, ERR_NOT_LEADER, ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE, ERR_PARTY_LFG_BOOT_IN_COMBAT, ERR_PARTY_LFG_BOOT_IN_PROGRESS, ERR_PARTY_LFG_BOOT_LIMIT, ERR_PARTY_LFG_BOOT_LOOT_ROLLS, ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S, ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS, ERR_PARTY_RESULT_OK, ObjectAccessor::FindConnectedPlayer(), Group::GetFirstMember(), GetGroup(), Object::GetGUID(), Group::GetGUID(), Group::GetMembersCount(), InBattleground(), Group::IsAssistant(), Group::IsLeader(), Group::isLFGGroup(), Group::isRollLootActive(), lfg::LFG_GROUP_KICK_VOTES_NEEDED, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_BOOT, lfg::LFG_STATE_FINISHED_DUNGEON, GroupReference::next(), sLFGMgr, and sWorld.

Referenced by WorldSession::HandleGroupUninviteGuidOpcode(), and WorldSession::HandleGroupUninviteOpcode().

◆ CanUseAmmo()

InventoryResult Player::CanUseAmmo ( uint32  item) const
2463{
2464 LOG_DEBUG("entities.player.items", "STORAGE: CanUseAmmo item = {}", item);
2465 if (!IsAlive())
2467 //if (isStunned())
2468 // return EQUIP_ERR_YOU_ARE_STUNNED;
2469 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
2470 if (pProto)
2471 {
2472 if (pProto->InventoryType != INVTYPE_AMMO)
2474
2475 InventoryResult res = CanUseItem(pProto);
2476 if (res != EQUIP_ERR_OK)
2477 return res;
2478
2479 /*if (GetReputationMgr().GetReputation() < pProto->RequiredReputation)
2480 return EQUIP_ERR_CANT_EQUIP_REPUTATION;
2481 */
2482
2483 // Requires No Ammo
2484 if (HasAura(46699))
2485 return EQUIP_ERR_BAG_FULL6;
2486
2487 return EQUIP_ERR_OK;
2488 }
2490}
@ EQUIP_ERR_YOU_ARE_DEAD
Definition: Item.h:85
@ EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE
Definition: Item.h:54
@ EQUIP_ERR_BAG_FULL6
Definition: Item.h:109
@ INVTYPE_AMMO
Definition: ItemTemplate.h:280

References CanUseItem(), EQUIP_ERR_BAG_FULL6, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE, EQUIP_ERR_YOU_ARE_DEAD, Unit::HasAura(), ItemTemplate::InventoryType, INVTYPE_AMMO, Unit::IsAlive(), LOG_DEBUG, and sObjectMgr.

Referenced by Create(), and SetAmmo().

◆ CanUseBattlegroundObject()

bool Player::CanUseBattlegroundObject ( GameObject gameobject) const
Bug:
sometimes when player clicks on flag in AB - client won't send gameobject_use, only gameobject_report_use packet Note: Mount, stealth and invisibility will be removed when used
13165{
13166 // It is possible to call this method will a nullptr pointer, only skipping faction check.
13167 if (gameobject)
13168 {
13169 FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry();
13170 FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetUInt32Value(GAMEOBJECT_FACTION));
13171
13172 if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction))
13173 return false;
13174 }
13175
13181 return (!isTotalImmune() && // Damage immune
13182 !HasAura(SPELL_RECENTLY_DROPPED_FLAG) && // Still has recently held flag debuff
13183 IsAlive()); // Alive
13184}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
@ GAMEOBJECT_FACTION
Definition: UpdateFields.h:402
@ SPELL_RECENTLY_DROPPED_FLAG
Definition: Battleground.h:135
bool isTotalImmune() const
Definition: Player.cpp:13256
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:10074
Definition: DBCStructure.h:939
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:951

References GAMEOBJECT_FACTION, Unit::GetFactionTemplateEntry(), Object::GetUInt32Value(), Unit::HasAura(), Unit::IsAlive(), FactionTemplateEntry::IsFriendlyTo(), isTotalImmune(), sFactionTemplateStore, and SPELL_RECENTLY_DROPPED_FLAG.

Referenced by Spell::CheckCast(), and GameObject::Use().

◆ CanUseItem() [1/2]

InventoryResult Player::CanUseItem ( Item pItem,
bool  not_loading = true 
) const
Todo:
: when you right-click already equipped item it throws EQUIP_ERR_NO_REQUIRED_PROFICIENCY.
2220{
2221 if (pItem)
2222 {
2223 LOG_DEBUG("entities.player.items", "STORAGE: CanUseItem item = {}", pItem->GetEntry());
2224
2225 if (!IsAlive() && not_loading)
2227
2228 //if (isStunned())
2229 // return EQUIP_ERR_YOU_ARE_STUNNED;
2230
2231 ItemTemplate const* pProto = pItem->GetTemplate();
2232 if (pProto)
2233 {
2234 if (pItem->IsBindedNotWith(this))
2236
2237 InventoryResult res = CanUseItem(pProto);
2238 if (res != EQUIP_ERR_OK)
2239 return res;
2240
2241 if (pItem->GetSkill() != 0)
2242 {
2243 bool allowEquip = false;
2244 uint32 itemSkill = pItem->GetSkill();
2245 // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet.
2246 if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill))
2247 {
2249
2250 // In fact it's a visual bug, everything works properly... I need sniffs of operations with
2251 // binded to account items from off server.
2252
2254 {
2255 allowEquip = (itemSkill == SKILL_PLATE_MAIL);
2256 }
2258 {
2259 allowEquip = (itemSkill == SKILL_MAIL);
2260 }
2261 }
2262 if (!allowEquip && GetSkillValue(itemSkill) == 0)
2264 }
2265
2268
2269 return EQUIP_ERR_OK;
2270 }
2271 }
2273}
@ EQUIP_ERR_CANT_EQUIP_REPUTATION
Definition: Item.h:111
@ ITEM_QUALITY_HEIRLOOM
Definition: SharedDefines.h:336
@ SKILL_PLATE_MAIL
Definition: SharedDefines.h:2951
@ SKILL_MAIL
Definition: SharedDefines.h:2962
uint32 GetSkill()
Definition: Item.cpp:555
uint32 Quality
Definition: ItemTemplate.h:626

References CanUseItem(), ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_HUNTER, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARRIOR, EQUIP_ERR_CANT_EQUIP_REPUTATION, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, Object::GetEntry(), GetReputationRank(), Item::GetSkill(), GetSkillValue(), Item::GetTemplate(), HasSkill(), Unit::IsAlive(), Item::IsBindedNotWith(), IsClass(), ITEM_CLASS_ARMOR, ITEM_QUALITY_HEIRLOOM, LOG_DEBUG, ItemTemplate::Quality, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, SKILL_MAIL, and SKILL_PLATE_MAIL.

Referenced by CanBankItem(), CanEquipItem(), CanUseAmmo(), CanUseItem(), WorldSession::HandleReadItem(), and WorldSession::HandleUseItemOpcode().

◆ CanUseItem() [2/2]

InventoryResult Player::CanUseItem ( ItemTemplate const *  pItem) const
2276{
2277 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2278
2279 if (!proto)
2280 {
2282 }
2283
2284 if (proto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) != TEAM_HORDE)
2285 {
2287 }
2288
2289 if (proto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) != TEAM_ALLIANCE)
2290 {
2292 }
2293
2294 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2295 {
2297 }
2298
2299 if (proto->RequiredSkill != 0)
2300 {
2301 if (GetSkillValue(proto->RequiredSkill) == 0)
2302 {
2304 }
2305 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2306 {
2308 }
2309 }
2310
2311 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2312 {
2314 }
2315
2316 if (GetLevel() < proto->RequiredLevel)
2317 {
2319 }
2320
2321 // If World Event is not active, prevent using event dependant items
2322 if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId))
2323 {
2325 }
2326
2328
2329 if (!sScriptMgr->OnPlayerCanUseItem(const_cast<Player*>(this), proto, result))
2330 {
2331 return result;
2332 }
2333
2334 return EQUIP_ERR_OK;
2335}
@ EQUIP_ERR_CANT_EQUIP_LEVEL_I
Definition: Item.h:48
bool IsHolidayActive(HolidayIds id)
Definition: GameEventMgr.cpp:1950
HolidayIds
Definition: SharedDefines.h:2741

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Unit::GetLevel(), Unit::getRaceMask(), GetSkillValue(), GetTeamId(), ItemTemplate::HasFlag2(), HasSpell(), ItemTemplate::HolidayId, IsHolidayActive(), ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::RequiredLevel, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, sScriptMgr, TEAM_ALLIANCE, and TEAM_HORDE.

◆ CastItemCombatSpell() [1/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx 
)
7200{
7201 if (!target || !target->IsAlive() || target == this)
7202 return;
7203
7204 // Xinef: do not use disarmed weapons, special exception - shaman ghost wolf form
7205 // Xinef: normal forms proc on hit enchants / built in item bonuses
7207 return;
7208
7210 {
7211 // If usable, try to cast item spell
7212 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
7213 if (!item->IsBroken())
7214 if (ItemTemplate const* proto = item->GetTemplate())
7215 {
7216 // Additional check for weapons
7217 if (proto->Class == ITEM_CLASS_WEAPON)
7218 {
7219 // offhand item cannot proc from main hand hit etc
7220 EquipmentSlots slot;
7221 switch (attType)
7222 {
7223 case BASE_ATTACK:
7225 break;
7226 case OFF_ATTACK:
7228 break;
7229 case RANGED_ATTACK:
7230 slot = EQUIPMENT_SLOT_RANGED;
7231 break;
7232 default:
7233 slot = EQUIPMENT_SLOT_END;
7234 break;
7235 }
7236 if (slot != i)
7237 continue;
7238 }
7239
7240 CastItemCombatSpell(target, attType, procVictim, procEx, item, proto);
7241 }
7242 }
7243}
@ FORM_GHOSTWOLF
Definition: UnitDefines.h:85
EquipmentSlots
Definition: Player.h:679
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7199

References BASE_ATTACK, Unit::CanUseAttackType(), CastItemCombatSpell(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, FORM_GHOSTWOLF, GetItemByPos(), Unit::GetShapeshiftForm(), INVENTORY_SLOT_BAG_0, Unit::IsAlive(), ITEM_CLASS_WEAPON, OFF_ATTACK, and RANGED_ATTACK.

Referenced by CastItemCombatSpell(), Unit::DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ CastItemCombatSpell() [2/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx,
Item item,
ItemTemplate const *  proto 
)
7246{
7247 if (!sScriptMgr->OnPlayerCanCastItemCombatSpell(this, target, attType, procVictim, procEx, item, proto))
7248 return;
7249
7250 // Can do effect if any damage done to target
7251 if (procVictim & PROC_FLAG_TAKEN_DAMAGE)
7252 //if (damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE)
7253 {
7254 for (uint8 i = 0; i < MAX_ITEM_SPELLS; ++i)
7255 {
7256 _Spell const& spellData = proto->Spells[i];
7257
7258 // no spell
7259 if (!spellData.SpellId)
7260 continue;
7261
7262 // wrong triggering type
7264 continue;
7265
7266 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7267 if (!spellInfo)
7268 {
7269 LOG_ERROR("entities.player", "WORLD: unknown Item spellid {}", spellData.SpellId);
7270 continue;
7271 }
7272
7273 float chance = (float)spellInfo->ProcChance;
7274
7275 if (spellData.SpellPPMRate)
7276 {
7277 uint32 WeaponSpeed = GetAttackTime(attType);
7278 chance = GetPPMProcChance(WeaponSpeed, spellData.SpellPPMRate, spellInfo);
7279 }
7280 else if (chance > 100.0f)
7281 {
7282 chance = GetWeaponProcChance();
7283 }
7284
7285 if (roll_chance_f(chance) && sScriptMgr->OnCastItemCombatSpell(this, target, spellInfo, item))
7287 }
7288 }
7289
7290 // item combat enchantments
7291 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7292 {
7293 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7294 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7295 if (!pEnchant)
7296 continue;
7297
7298 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7299 {
7300 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
7301 continue;
7302
7303 SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id);
7304
7305 if (entry && entry->procEx)
7306 {
7307 // Check hit/crit/dodge/parry requirement
7308 if ((entry->procEx & procEx) == 0)
7309 continue;
7310 }
7311 else
7312 {
7313 // Can do effect if any damage done to target
7314 if (!(procVictim & PROC_FLAG_TAKEN_DAMAGE))
7315 //if (!(damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE))
7316 continue;
7317 }
7318
7319 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_WHITE_HIT) && (procVictim & SPELL_PROC_FLAG_MASK))
7320 continue;
7321
7322 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7323 if (!spellInfo)
7324 {
7325 LOG_ERROR("entities.player", "Player::CastItemCombatSpell({}, name: {}, enchant: {}): unknown spell {} is casted, ignoring...",
7326 GetGUID().ToString(), GetName(), pEnchant->ID, pEnchant->spellid[s]);
7327 continue;
7328 }
7329
7330 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_EXCLUSIVE) != 0)
7331 {
7332 Unit* checkTarget = spellInfo->IsPositive() ? this : target;
7333 if (checkTarget->HasAura(spellInfo->Id, GetGUID()))
7334 {
7335 continue;
7336 }
7337 }
7338
7339 float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : GetWeaponProcChance();
7340
7341 if (entry)
7342 {
7343 if (entry->PPMChance)
7344 chance = GetPPMProcChance(proto->Delay, entry->PPMChance, spellInfo);
7345 else if (entry->customChance)
7346 chance = (float)entry->customChance;
7347 }
7348
7349 // Apply spell mods
7350 ApplySpellMod(pEnchant->spellid[s], SPELLMOD_CHANCE_OF_SUCCESS, chance);
7351
7352 // Shiv has 100% chance to apply the poison
7353 if (FindCurrentSpellBySpellId(5938) && e_slot == TEMP_ENCHANTMENT_SLOT)
7354 chance = 100.0f;
7355
7356 if (roll_chance_f(chance))
7357 {
7358 // Xinef: implement enchant charges
7359 if (uint32 charges = item->GetEnchantmentCharges(EnchantmentSlot(e_slot)))
7360 {
7361 if (!--charges)
7362 {
7363 ApplyEnchantment(item, EnchantmentSlot(e_slot), false);
7364 item->ClearEnchantment(EnchantmentSlot(e_slot));
7365 }
7366 else
7367 item->SetEnchantmentCharges(EnchantmentSlot(e_slot), charges);
7368 }
7369
7370 Unit* unitTarget = spellInfo->IsPositive() ? this : target;
7372 }
7373 }
7374 }
7375}
@ ITEM_SPELLTRIGGER_CHANCE_ON_HIT
Definition: ItemTemplate.h:79
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:94
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore GCD.
Definition: SpellDefines.h:135
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
@ SPELL_PROC_FLAG_MASK
Definition: SpellMgr.h:156
@ ENCHANT_PROC_ATTR_WHITE_HIT
Definition: SpellMgr.h:310
@ ENCHANT_PROC_ATTR_EXCLUSIVE
Definition: SpellMgr.h:309
bool roll_chance_f(float chance)
Definition: Random.h:54
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
Definition: Item.cpp:951
void ClearEnchantment(EnchantmentSlot slot)
Definition: Item.cpp:960
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
Definition: Item.h:306
float SpellPPMRate
Definition: ItemTemplate.h:594
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13495
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4177
float GetWeaponProcChance() const
Definition: Unit.cpp:13484
bool IsPositive() const
Definition: SpellInfo.cpp:1237
uint32 ProcChance
Definition: SpellInfo.h:356
Definition: SpellMgr.h:314
uint32 procEx
Definition: SpellMgr.h:317
uint32 attributeMask
Definition: SpellMgr.h:318
uint32 customChance
Definition: SpellMgr.h:315
float PPMChance
Definition: SpellMgr.h:316
uint32 ID
Definition: DBCStructure.h:1843

References SpellItemEnchantmentEntry::amount, ApplyEnchantment(), ApplySpellMod(), SpellEnchantProcEntry::attributeMask, Unit::CastSpell(), Item::ClearEnchantment(), SpellEnchantProcEntry::customChance, ItemTemplate::Delay, ENCHANT_PROC_ATTR_EXCLUSIVE, ENCHANT_PROC_ATTR_WHITE_HIT, Unit::FindCurrentSpellBySpellId(), Unit::GetAttackTime(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Object::GetGUID(), WorldObject::GetName(), Unit::GetPPMProcChance(), Unit::GetWeaponProcChance(), Unit::HasAura(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, SpellInfo::IsPositive(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_SPELLTRIGGER_CHANCE_ON_HIT, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, SpellEnchantProcEntry::PPMChance, PROC_FLAG_TAKEN_DAMAGE, SpellInfo::ProcChance, SpellEnchantProcEntry::procEx, roll_chance_f(), Item::SetEnchantmentCharges(), SPELL_PROC_FLAG_MASK, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, SPELLMOD_CHANCE_OF_SUCCESS, _Spell::SpellPPMRate, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Position::ToString(), TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD, and SpellItemEnchantmentEntry::type.

◆ CastItemUseSpell()

void Player::CastItemUseSpell ( Item item,
SpellCastTargets const &  targets,
uint8  cast_count,
uint32  glyphIndex 
)
7378{
7379 if (!sScriptMgr->OnPlayerCanCastItemUseSpell(this, item, targets, cast_count, glyphIndex))
7380 return;
7381
7382 ItemTemplate const* proto = item->GetTemplate();
7383 // special learning case
7384 if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884)
7385 {
7386 uint32 learn_spell_id = proto->Spells[0].SpellId;
7387 uint32 learning_spell_id = proto->Spells[1].SpellId;
7388
7389 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id);
7390 if (!spellInfo)
7391 {
7392 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring ", proto->ItemId, learn_spell_id);
7393 SendEquipError(EQUIP_ERR_NONE, item, nullptr);
7394 return;
7395 }
7396
7397 Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
7398 spell->m_CastItem = item;
7399 spell->m_cast_count = cast_count; //set count of casts
7400 spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
7401 spell->prepare(&targets);
7402 return;
7403 }
7404
7405 // use triggered flag only for items with many spell casts and for not first cast
7406 uint8 count = 0;
7407
7408 std::list<Spell*> pushSpells;
7409 // item spells casted at use
7410 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7411 {
7412 _Spell const& spellData = proto->Spells[i];
7413
7414 // no spell
7415 if (!spellData.SpellId)
7416 continue;
7417
7418 // wrong triggering type
7419 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
7420 continue;
7421
7422 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7423 if (!spellInfo)
7424 {
7425 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring", proto->ItemId, spellData.SpellId);
7426 continue;
7427 }
7428
7429 if (HasSpellCooldown(spellInfo->Id))
7430 {
7431 continue;
7432 }
7433
7434 if (!spellInfo->CheckElixirStacking(this))
7435 {
7436 Spell::SendCastResult(this, spellInfo, cast_count, SPELL_FAILED_AURA_BOUNCED);
7437 continue;
7438 }
7439
7440 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7441 spell->m_CastItem = item;
7442 spell->m_cast_count = cast_count; // set count of casts
7443 spell->m_glyphIndex = glyphIndex; // glyph index
7444 spell->InitExplicitTargets(targets);
7445
7446 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7447 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7448 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7449 SpellCastResult result = spell->CheckCast(true);
7450 if (result != SPELL_CAST_OK)
7451 {
7452 spell->SendCastResult(result);
7453 delete spell;
7454 continue;
7455 }
7456
7457 pushSpells.push_back(spell);
7458 //spell->prepare(&targets);
7459
7460 ++count;
7461 }
7462
7463 // Item enchantments spells casted at use
7464 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7465 {
7466 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7467 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7468 if (!pEnchant)
7469 continue;
7470 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7471 {
7472 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_USE_SPELL)
7473 continue;
7474
7475 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7476 if (!spellInfo)
7477 {
7478 LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant {}, cast unknown spell {}", pEnchant->ID, pEnchant->spellid[s]);
7479 continue;
7480 }
7481
7482 if (HasSpellCooldown(spellInfo->Id))
7483 continue;
7484
7485 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7486 spell->m_CastItem = item;
7487 spell->m_cast_count = cast_count; // set count of casts
7488 spell->m_glyphIndex = glyphIndex; // glyph index
7489 spell->InitExplicitTargets(targets);
7490
7491 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7492 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7493 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7494 SpellCastResult result = spell->CheckCast(true);
7495 if (result != SPELL_CAST_OK)
7496 {
7497 spell->SendCastResult(result);
7498 delete spell;
7499 continue;
7500 }
7501
7502 pushSpells.push_back(spell);
7503 //spell->prepare(&targets);
7504
7505 ++count;
7506 }
7507 }
7508
7509 // xinef: send all spells in one go, prevents crash because container is not set
7510 for (std::list<Spell*>::const_iterator itr = pushSpells.begin(); itr != pushSpells.end(); ++itr)
7511 (*itr)->prepare(&targets);
7512}
@ EQUIP_ERR_NONE
Definition: Item.h:106
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:113
@ TRIGGERED_NONE
Definition: SpellDefines.h:133
SpellCastResult
Definition: SharedDefines.h:948
@ SPELL_FAILED_AURA_BOUNCED
Definition: SharedDefines.h:958
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16274
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3485
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8464
uint8 m_cast_count
Definition: Spell.h:527
uint32 m_glyphIndex
Definition: Spell.h:528
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5669
void InitExplicitTargets(SpellCastTargets const &targets)
Definition: Spell.cpp:717
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4685
Item * m_CastItem
Definition: Spell.h:524
bool CheckElixirStacking(Unit const *caster) const
Definition: SpellInfo.cpp:2892

References Spell::CheckCast(), SpellInfo::CheckElixirStacking(), EQUIP_ERR_NONE, Item::GetEnchantmentId(), Item::GetTemplate(), HasSpellCooldown(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, Spell::InitExplicitTargets(), ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::ItemId, LOG_ERROR, Spell::m_cast_count, Spell::m_CastItem, Spell::m_glyphIndex, MAX_ENCHANTMENT_SLOT, MAX_ITEM_PROTO_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, Spell::prepare(), Spell::SendCastResult(), SendEquipError(), Spell::SetSpellValue(), SPELL_CAST_OK, SPELL_FAILED_AURA_BOUNCED, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, ItemTemplate::Spells, _Spell::SpellTrigger, SPELLVALUE_BASE_POINT0, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TRIGGERED_FULL_MASK, TRIGGERED_NONE, and SpellItemEnchantmentEntry::type.

Referenced by WorldSession::HandleUseItemOpcode().

◆ CharmSpellInitialize()

void Player::CharmSpellInitialize ( )
9656{
9657 Unit* charm = GetFirstControlled();
9658 if (!charm)
9659 return;
9660
9661 CharmInfo* charmInfo = charm->GetCharmInfo();
9662 if (!charmInfo)
9663 {
9664 LOG_ERROR("entities.player", "Player::CharmSpellInitialize(): the player's charm ({}) has no charminfo!", charm->GetGUID().ToString());
9665 return;
9666 }
9667
9668 uint8 addlist = 0;
9669 if (!charm->IsPlayer())
9670 {
9671 //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate();
9672 //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK)
9673 {
9674 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9675 if (charmInfo->GetCharmSpell(i)->GetAction())
9676 ++addlist;
9677 }
9678 }
9679
9680 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 4 * addlist + 1);
9681 data << charm->GetGUID();
9682 data << uint16(0);
9683 data << uint32(0);
9684
9685 if (!charm->IsPlayer())
9686 data << uint8(charm->ToCreature()->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
9687 else
9688 data << uint32(0);
9689
9690 charmInfo->BuildActionBar(&data);
9691
9692 data << uint8(addlist);
9693
9694 if (addlist)
9695 {
9696 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9697 {
9698 CharmSpellInfo* cspell = charmInfo->GetCharmSpell(i);
9699 if (cspell->GetAction())
9700 data << uint32(cspell->packedData);
9701 }
9702 }
9703
9704 data << uint8(0); // cooldowns count
9705
9706 GetSession()->SendPacket(&data);
9707}
#define MAX_SPELL_CHARM
Definition: CharmInfo.h:24
#define MAX_UNIT_ACTION_BAR_INDEX
Definition: CharmInfo.h:29
@ SMSG_PET_SPELLS
Definition: Opcodes.h:407
ReactStates GetReactState() const
Definition: Creature.h:96
Definition: CharmInfo.h:95
uint32 packedData
Definition: CharmInfo.h:98
uint32 GetAction() const
Definition: CharmInfo.h:102
Definition: CharmInfo.h:127
CharmSpellInfo * GetCharmSpell(uint8 index)
Definition: CharmInfo.h:158
CommandStates GetCommandState() const
Definition: CharmInfo.h:136
void BuildActionBar(WorldPacket *data)
Definition: CharmInfo.cpp:285
CharmInfo * GetCharmInfo()
Definition: Unit.h:1206
Unit * GetFirstControlled() const
Definition: Unit.cpp:11119

References CharmInfo::BuildActionBar(), UnitActionBarEntry::GetAction(), Unit::GetCharmInfo(), CharmInfo::GetCharmSpell(), CharmInfo::GetCommandState(), Unit::GetFirstControlled(), Object::GetGUID(), Creature::GetReactState(), GetSession(), Object::IsPlayer(), LOG_ERROR, MAX_SPELL_CHARM, MAX_UNIT_ACTION_BAR_INDEX, UnitActionBarEntry::packedData, WorldSession::SendPacket(), SMSG_PET_SPELLS, Object::ToCreature(), and ObjectGuid::ToString().

Referenced by spell_mage_summon_water_elemental::HandleDummy(), WorldSession::HandleRequestPetInfo(), Unit::SetCharmedBy(), and Unit::SetMinion().

◆ CheckAllAchievementCriteria()

void Player::CheckAllAchievementCriteria ( )
13847{
13849}
void CheckAllAchievementCriteria()
Definition: AchievementMgr.cpp:796

References AchievementMgr::CheckAllAchievementCriteria(), and m_achievementMgr.

Referenced by Create(), and WorldSession::HandlePlayerLoginFromDB().

◆ CheckAmmoCompatibility()

bool Player::CheckAmmoCompatibility ( ItemTemplate const *  ammo_proto) const
7656{
7657 if (!ammo_proto)
7658 return false;
7659
7660 // check ranged weapon
7662 if (!weapon || weapon->IsBroken())
7663 return false;
7664
7665 ItemTemplate const* weapon_proto = weapon->GetTemplate();
7666 if (!weapon_proto || weapon_proto->Class != ITEM_CLASS_WEAPON)
7667 return false;
7668
7669 // check ammo ws. weapon compatibility
7670 switch (weapon_proto->SubClass)
7671 {
7674 if (ammo_proto->SubClass != ITEM_SUBCLASS_ARROW)
7675 return false;
7676 break;
7678 if (ammo_proto->SubClass != ITEM_SUBCLASS_BULLET)
7679 return false;
7680 break;
7681 default:
7682 return false;
7683 }
7684
7685 return true;
7686}
@ ITEM_SUBCLASS_WEAPON_CROSSBOW
Definition: ItemTemplate.h:362
@ ITEM_SUBCLASS_WEAPON_GUN
Definition: ItemTemplate.h:347
@ ITEM_SUBCLASS_WEAPON_BOW
Definition: ItemTemplate.h:346
@ ITEM_SUBCLASS_ARROW
Definition: ItemTemplate.h:416
@ ITEM_SUBCLASS_BULLET
Definition: ItemTemplate.h:417
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:488

References ItemTemplate::Class, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), ITEM_CLASS_WEAPON, ITEM_SUBCLASS_ARROW, ITEM_SUBCLASS_BULLET, ITEM_SUBCLASS_WEAPON_BOW, ITEM_SUBCLASS_WEAPON_CROSSBOW, ITEM_SUBCLASS_WEAPON_GUN, RANGED_ATTACK, and ItemTemplate::SubClass.

Referenced by _ApplyAmmoBonuses().

◆ CheckAreaExploreAndOutdoor()

void Player::CheckAreaExploreAndOutdoor ( )
5737{
5738 if (!IsAlive())
5739 return;
5740
5741 if (IsInFlight())
5742 return;
5743
5744 bool isOutdoor = IsOutdoors();
5745 uint32 areaId = GetAreaId();
5746 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
5747
5748 if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && _wasOutdoor != isOutdoor)
5749 {
5750 _wasOutdoor = isOutdoor;
5751
5753 SpellAttr0 attrToRecalculate = isOutdoor ? SPELL_ATTR0_ONLY_OUTDOORS : SPELL_ATTR0_ONLY_INDOORS;
5754 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5755 {
5756 Aura* aura = iter->second->GetBase();
5757 SpellInfo const* spell = aura->GetSpellInfo();
5758 if (spell->Attributes & attrToRemove)
5759 {
5760 // if passive - do not remove and just turn off all effects
5761 if (aura->IsPassive())
5762 {
5763 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, false);
5764 ++iter;
5765 continue;
5766 }
5767
5768 RemoveAura(iter);
5769 }
5770 else if ((spell->Attributes & attrToRecalculate) && aura->IsPassive())
5771 {
5772 // if passive - turn on all effects
5773 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, true);
5774 ++iter;
5775 }
5776 else
5777 {
5778 ++iter;
5779 }
5780 }
5781 }
5782
5783 if (!sScriptMgr->OnPlayerCanAreaExploreAndOutdoor(this))
5784 return;
5785
5786 if (!areaId)
5787 return;
5788
5789 if (!areaEntry)
5790 {
5791 LOG_ERROR("entities.player", "Player '{}' ({}) discovered unknown area (x: {} y: {} z: {} map: {})",
5793 return;
5794 }
5795
5796 uint32 offset = areaEntry->exploreFlag / 32;
5797
5798 if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
5799 {
5800 LOG_ERROR("entities.player", "Wrong area flag {} in map data for (X: {} Y: {}) point to field PLAYER_EXPLORED_ZONES_1 + {} ( {} must be < {} ).", areaEntry->flags, GetPositionX(), GetPositionY(), offset, offset, PLAYER_EXPLORED_ZONES_SIZE);
5801 return;
5802 }
5803
5804 uint32 val = (uint32)(1 << (areaEntry->exploreFlag % 32));
5805 uint32 currFields = GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
5806
5807 if (!(currFields & val))
5808 {
5809 SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
5810
5812
5813 if (areaEntry->area_level > 0)
5814 {
5815 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
5816 {
5817 SendExplorationExperience(areaId, 0);
5818 }
5819 else
5820 {
5821 int32 diff = int32(GetLevel()) - areaEntry->area_level;
5822 uint32 XP = 0;
5823 if (diff < -5)
5824 {
5825 XP = uint32(sObjectMgr->GetBaseXP(GetLevel() + 5) * sWorld->getRate(RATE_XP_EXPLORE));
5826 }
5827 else if (diff > 5)
5828 {
5829 int32 exploration_percent = (100 - ((diff - 5) * 5));
5830 if (exploration_percent > 100)
5831 exploration_percent = 100;
5832 else if (exploration_percent < 0)
5833 exploration_percent = 0;
5834
5835 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * exploration_percent / 100 * sWorld->getRate(RATE_XP_EXPLORE));
5836 }
5837 else
5838 {
5839 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * sWorld->getRate(RATE_XP_EXPLORE));
5840 }
5841
5842 sScriptMgr->OnPlayerGiveXP(this, XP, nullptr, PlayerXPSource::XPSOURCE_EXPLORE);
5843 GiveXP(XP, nullptr);
5844 SendExplorationExperience(areaId, XP);
5845 }
5846 LOG_DEBUG("entities.player", "Player {} discovered a new area: {}", GetGUID().ToString(), areaId);
5847 }
5848 }
5849}
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
@ CONFIG_MAX_PLAYER_LEVEL
Definition: IWorld.h:236
@ CONFIG_VMAP_INDOOR_CHECK
Definition: IWorld.h:120
@ RATE_XP_EXPLORE
Definition: IWorld.h:483
@ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA
Definition: DBCEnums.h:157
@ SPELL_ATTR0_ONLY_INDOORS
Definition: SharedDefines.h:396
@ SPELL_ATTR0_ONLY_OUTDOORS
Definition: SharedDefines.h:397
bool IsOutdoors() const
Definition: Object.cpp:3173
void SendExplorationExperience(uint32 Area, uint32 Experience)
Definition: PlayerMisc.cpp:159
void GiveXP(uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
Definition: Player.cpp:2379
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4809
bool IsInFlight() const
Definition: Unit.h:1616
AuraApplicationMap m_appliedAuras
Definition: Unit.h:2071
void HandleAllEffects(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuras.cpp:1241
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
bool IsPassive() const
Definition: SpellAuras.cpp:1082
uint32 Attributes
Definition: SpellInfo.h:324
Definition: DBCStructure.h:519
int32 area_level
Definition: DBCStructure.h:526
uint32 flags
Definition: DBCStructure.h:524
uint32 exploreFlag
Definition: DBCStructure.h:523

References _wasOutdoor, ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA, AreaTableEntry::area_level, SpellInfo::Attributes, AURA_EFFECT_HANDLE_REAL, CONFIG_MAX_PLAYER_LEVEL, CONFIG_VMAP_INDOOR_CHECK, AreaTableEntry::exploreFlag, AreaTableEntry::flags, WorldObject::GetAreaId(), Object::GetGUID(), Unit::GetLevel(), WorldLocation::GetMapId(), WorldObject::GetName(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Aura::GetSpellInfo(), Object::GetUInt32Value(), GiveXP(), Aura::HandleAllEffects(), Unit::IsAlive(), Unit::IsInFlight(), WorldObject::IsOutdoors(), Aura::IsPassive(), LOG_DEBUG, LOG_ERROR, Unit::m_appliedAuras, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, RATE_XP_EXPLORE, Unit::RemoveAura(), sAreaTableStore, SendExplorationExperience(), Unit::SetUInt32Value(), sObjectMgr, SPELL_ATTR0_ONLY_INDOORS, SPELL_ATTR0_ONLY_OUTDOORS, sScriptMgr, sWorld, Position::ToString(), and UpdateAchievementCriteria().

Referenced by UpdatePosition().

◆ CheckDuelDistance()

void Player::CheckDuelDistance ( time_t  currTime)
6391{
6392 if (!duel)
6393 {
6394 return;
6395 }
6396
6398 GameObject* obj = GetMap()->GetGameObject(duelFlagGUID);
6399 if (!obj)
6400 return;
6401
6402 if (!duel->OutOfBoundsTime)
6403 {
6404 if (!IsWithinDistInMap(obj, 50))
6405 {
6406 duel->OutOfBoundsTime = currTime + 10;
6407
6409 GetSession()->SendPacket(&data);
6410 }
6411 }
6412 else
6413 {
6414 if (IsWithinDistInMap(obj, 40))
6415 {
6416 duel->OutOfBoundsTime = 0;
6417
6419 GetSession()->SendPacket(&data);
6420 }
6421 else if (currTime >= duel->OutOfBoundsTime)
6423 }
6424}
@ PLAYER_DUEL_ARBITER
Definition: UpdateFields.h:177
@ DUEL_FLED
Definition: SharedDefines.h:3630
@ SMSG_DUEL_INBOUNDS
Definition: Opcodes.h:391
@ SMSG_DUEL_OUTOFBOUNDS
Definition: Opcodes.h:390
Definition: GameObject.h:120
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1332
void DuelComplete(DuelCompleteType type)
Definition: Player.cpp:6431
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1886
GameObject * GetGameObject(ObjectGuid const guid)
Definition: Map.cpp:2503

References duel, DUEL_FLED, DuelComplete(), Map::GetGameObject(), Object::GetGuidValue(), WorldObject::GetMap(), GetSession(), WorldObject::IsWithinDistInMap(), PLAYER_DUEL_ARBITER, WorldSession::SendPacket(), SMSG_DUEL_INBOUNDS, and SMSG_DUEL_OUTOFBOUNDS.

Referenced by Update().

◆ CheckInstanceCount()

bool Player::CheckInstanceCount ( uint32  instanceId) const
6982{
6983 if (_instanceResetTimes.size() < sWorld->getIntConfig(CONFIG_MAX_INSTANCES_PER_HOUR))
6984 return true;
6985 return _instanceResetTimes.find(instanceId) != _instanceResetTimes.end();
6986}
@ CONFIG_MAX_INSTANCES_PER_HOUR
Definition: IWorld.h:368

References _instanceResetTimes, CONFIG_MAX_INSTANCES_PER_HOUR, and sWorld.

Referenced by MapMgr::PlayerCannotEnter().

◆ CheckInstanceLoginValid()

bool Player::CheckInstanceLoginValid ( )
6953{
6954 if (!GetMap())
6955 return false;
6956
6957 if (!GetMap()->IsDungeon() || IsGameMaster())
6958 return true;
6959
6960 if (GetMap()->IsRaid())
6961 {
6962 // cannot be in raid instance without a group
6963 if (!GetGroup() && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
6964 return false;
6965 }
6966 else
6967 {
6968 // cannot be in normal instance without a group and more players than 1 in instance
6969 if (!GetGroup() && GetMap()->GetPlayersCountExceptGMs() > 1)
6970 return false;
6971 }
6972
6973 // pussywizard: check CanEnter for GetMap(), because in PlayerCannotEnter it is called for a map decided before loading screen (can change)
6974 if (GetMap()->CannotEnter(this, true))
6975 return false;
6976
6977 // do checks for satisfy accessreqs, instance full, encounter in progress (raid), perm bind group != perm bind player
6978 return sMapMgr->PlayerCannotEnter(GetMap()->GetId(), this, true) == Map::CAN_ENTER;
6979}
#define sMapMgr
Definition: MapMgr.h:220
@ CONFIG_INSTANCE_IGNORE_RAID
Definition: IWorld.h:83
uint32 GetId(std::string const &username)
Definition: AccountMgr.cpp:229
@ CAN_ENTER
Definition: Map.h:271

References Map::CAN_ENTER, CONFIG_INSTANCE_IGNORE_RAID, GetGroup(), WorldObject::GetMap(), IsGameMaster(), sMapMgr, and sWorld.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ CleanupAfterTaxiFlight()

void Player::CleanupAfterTaxiFlight ( )
10379{
10380 // For spells that trigger flying paths remove them at arrival
10382 {
10385 }
10386 m_taxi.ClearTaxiDestinations(); // not destinations, clear source node
10387 Dismount();
10390}
@ UNIT_FLAG_TAXI_FLIGHT
Definition: UnitDefines.h:270
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
void Dismount()
Definition: Unit.cpp:13568
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:900

References PlayerTaxi::ClearTaxiDestinations(), Unit::Dismount(), Unit::getHostileRefMgr(), m_flightSpellActivated, m_taxi, Unit::RemoveAurasDueToSpell(), Unit::RemoveUnitFlag(), HostileRefMgr::setOnlineOfflineState(), UNIT_FLAG_DISABLE_MOVE, and UNIT_FLAG_TAXI_FLIGHT.

Referenced by go_commandscript::DoTeleport(), misc_commandscript::HandleAppearCommand(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), and TeleportTo().

◆ CleanupChannels()

void Player::CleanupChannels ( )
5011{
5012 while (!m_channels.empty())
5013 {
5014 Channel* ch = *m_channels.begin();
5015 m_channels.erase(m_channels.begin()); // remove from player's channel list
5016 ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list
5017 }
5018}
Definition: Channel.h:144
void LeaveChannel(Player *player, bool send=true)
Definition: Channel.cpp:249
JoinedChannelsList m_channels
Definition: Player.h:2859

References Channel::LeaveChannel(), and m_channels.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), and WorldSession::LogoutPlayer().

◆ CleanupsBeforeDelete()

void Player::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

467{
468 TradeCancel(false);
470
471 Unit::CleanupsBeforeDelete(finalCleanup);
472}
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3628
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition: Unit.cpp:15808

References Unit::CleanupsBeforeDelete(), DUEL_INTERRUPTED, DuelComplete(), and TradeCancel().

Referenced by WorldSession::LogoutPlayer().

◆ ClearAfkReports()

void Player::ClearAfkReports ( )
inline
2294{ m_bgData.bgAfkReporter.clear(); }
GuidSet bgAfkReporter
Definition: Player.h:1048

References BGData::bgAfkReporter, and m_bgData.

Referenced by Battleground::RemovePlayerAtLeave().

◆ ClearChannelWatch()

void Player::ClearChannelWatch ( )
5021{
5022 for (JoinedChannelsList::iterator itr = m_channels.begin(); itr != m_channels.end(); ++itr)
5023 (*itr)->RemoveWatching(this);
5024}

References m_channels.

Referenced by WorldSession::HandleSetChannelWatch().

◆ ClearReceivedSpectatorResetFor()

void Player::ClearReceivedSpectatorResetFor ( )
inline

◆ clearResurrectRequestData()

void Player::clearResurrectRequestData ( )
inline
1834{ setResurrectRequestData(ObjectGuid::Empty, 0, 0.0f, 0.0f, 0.0f, 0, 0); }
void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
Definition: Player.h:1824

References ObjectGuid::Empty, and setResurrectRequestData().

Referenced by WorldSession::HandleResurrectResponseOpcode(), Player(), and setDeathState().

◆ ClearWhisperWhiteList()

void Player::ClearWhisperWhiteList ( )
inline
2568{ WhisperList.clear(); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ CompletedAchievement()

void Player::CompletedAchievement ( AchievementEntry const *  entry)
13882{
13884}
void CompletedAchievement(AchievementEntry const *entry)
Definition: AchievementMgr.cpp:2266

References AchievementMgr::CompletedAchievement(), and m_achievementMgr.

Referenced by achievement_commandscript::HandleAchievementAddCommand(), and ArenaSeasonTeamRewarderImpl::RewardWithAchievements().

◆ CompleteQuest()

void Player::CompleteQuest ( uint32  quest_id)
599{
600 if (!quest_id)
601 {
602 return;
603 }
604
605 if (!sScriptMgr->OnPlayerBeforeQuestComplete(this, quest_id))
606 {
607 return;
608 }
609
611
612 auto log_slot = FindQuestSlot(quest_id);
613 if (log_slot < MAX_QUEST_LOG_SIZE)
614 {
616 }
617
618 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
619 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_TRACKING))
620 {
621 RewardQuest(qInfo, 0, this, false);
622 }
623
624 // Xinef: area auras may change on quest completion!
628
629 // check if Quest Tracker is enabled
630 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
631 {
632 // prepare Quest Tracker datas
633 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME);
634 stmt->SetData(0, quest_id);
635 stmt->SetData(1, GetGUID().GetCounter());
636
637 // add to Quest Tracker
638 CharacterDatabase.Execute(stmt);
639 }
640}
@ ADDITIONAL_SAVING_INVENTORY_AND_GOLD
Definition: Player.h:998
@ QUEST_FLAGS_TRACKING
Definition: QuestDef.h:142
@ CHAR_UPD_QUEST_TRACK_COMPLETE_TIME
Definition: CharacterDatabase.h:505
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition: PlayerQuest.cpp:659
void SetQuestStatus(uint32 questId, QuestStatus status, bool update=true)
Definition: PlayerQuest.cpp:1479

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, FindQuestSlot(), WorldObject::GetAreaId(), Object::GetGUID(), WorldObject::GetZoneId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_TRACKING, QUEST_STATE_COMPLETE, QUEST_STATUS_COMPLETE, RewardQuest(), SetQuestSlotState(), SetQuestStatus(), sObjectMgr, sScriptMgr, sWorld, UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_plucky::OnGossipSelect(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), TalkedToCreature(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ ContinueTaxiFlight()

void Player::ContinueTaxiFlight ( )
10393{
10394 uint32 sourceNode = m_taxi.GetTaxiSource();
10395 if (!sourceNode)
10396 return;
10397
10398 LOG_DEBUG("entities.unit", "WORLD: Restart character {} taxi flight", GetGUID().ToString());
10399
10400 uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeamId(true), true);
10401 if (!mountDisplayId)
10402 return;
10403
10405
10406 // search appropriate start path node
10407 uint32 startNode = 0;
10408
10409 TaxiPathNodeList const& nodeList = sTaxiPathNodesByPath[path];
10410
10411 float bestDist = SIZE_OF_GRIDS * SIZE_OF_GRIDS; // xinef: large value
10412 float currDist = 0.0f;
10413
10414 // xinef: changed to -1, we dont want to catch last node
10415 for (uint32 i = 0; i < nodeList.size() - 1; ++i)
10416 {
10417 TaxiPathNodeEntry const* node = nodeList[i];
10418 TaxiPathNodeEntry const* nextNode = nodeList[i + 1];
10419
10420 // xinef: skip nodes at another map, get last valid node on current map
10421 if (nextNode->mapid != GetMapId() || node->mapid != GetMapId())
10422 continue;
10423
10424 currDist = (node->x - GetPositionX()) * (node->x - GetPositionX()) + (node->y - GetPositionY()) * (node->y - GetPositionY()) + (node->z - GetPositionZ()) * (node->z - GetPositionZ());
10425 if (currDist < bestDist)
10426 {
10427 startNode = i;
10428 bestDist = currDist;
10429 }
10430 }
10431
10432 // xinef: no proper node was found
10433 if (startNode == 0)
10434 {
10436 return;
10437 }
10438
10440 {
10442 }
10443
10444 if (IsMounted())
10445 {
10447 }
10448
10449 SetCanTeleport(true);
10450
10451 GetSession()->SendDoFlight(mountDisplayId, path, startNode);
10452}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition: DBCStores.cpp:187
std::vector< TaxiPathNodeEntry const * > TaxiPathNodeList
Definition: DBCStructure.h:2246
#define SIZE_OF_GRIDS
Definition: MapDefines.h:26
void SetCanTeleport(bool value)
Definition: Player.h:2508
uint32 GetTaxiSource() const
Definition: PlayerTaxi.h:63
uint32 GetCurrentTaxiPath() const
Definition: PlayerTaxi.cpp:213
Definition: DBCStructure.h:1974
float y
Definition: DBCStructure.h:1980
float x
Definition: DBCStructure.h:1979
uint32 mapid
Definition: DBCStructure.h:1978
float z
Definition: DBCStructure.h:1981

References PlayerTaxi::ClearTaxiDestinations(), PlayerTaxi::GetCurrentTaxiPath(), Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), LOG_DEBUG, m_taxi, TaxiPathNodeEntry::mapid, Unit::RemoveAurasByType(), WorldSession::SendDoFlight(), SetCanTeleport(), SIZE_OF_GRIDS, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiPathNodesByPath, Position::ToString(), TaxiPathNodeEntry::x, TaxiPathNodeEntry::y, and TaxiPathNodeEntry::z.

Referenced by WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), and ProcessDelayedOperations().

◆ ConvertRune()

void Player::ConvertRune ( uint8  index,
RuneType  newType 
)
13363{
13364 SetCurrentRune(index, newType);
13365
13367 data << uint8(index);
13368 data << uint8(newType);
13369 GetSession()->SendPacket(&data);
13370}
@ SMSG_CONVERT_RUNE
Definition: Opcodes.h:1188
void SetCurrentRune(uint8 index, RuneType currentRune)
Definition: Player.h:2525

References GetSession(), WorldSession::SendPacket(), SetCurrentRune(), and SMSG_CONVERT_RUNE.

Referenced by AddRuneByAuraEffect(), RemoveRunesByAuraEffect(), and RestoreBaseRune().

◆ CorrectMetaGemEnchants()

void Player::CorrectMetaGemEnchants ( uint8  slot,
bool  apply 
)
11158{
11159 //cycle all equipped items
11160 for (uint32 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11161 {
11162 //enchants for the slot being socketed are handled by Player::ApplyItemMods
11163 if (slot == exceptslot)
11164 continue;
11165
11166 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11167
11168 if (!pItem || !pItem->HasSocket())
11169 continue;
11170
11171 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11172 {
11173 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11174 if (!enchant_id)
11175 continue;
11176
11177 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11178 if (!enchantEntry)
11179 continue;
11180
11181 uint32 condition = enchantEntry->EnchantmentCondition;
11182 if (condition)
11183 {
11184 //was enchant active with/without item?
11185 bool wasactive = EnchantmentFitsRequirements(condition, apply ? exceptslot : -1);
11186 //should it now be?
11187 if (wasactive ^ EnchantmentFitsRequirements(condition, apply ? -1 : exceptslot))
11188 {
11189 // ignore item gem conditions
11190 //if state changed, (dis)apply enchant
11191 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), !wasactive, true, true);
11192 }
11193 }
11194 }
11195 }
11196}

References ApplyEnchantment(), SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by _ApplyItemMods().

◆ Create()

bool Player::Create ( ObjectGuid::LowType  guidlow,
CharacterCreateInfo createInfo 
)
Todo:
: need more checks against packet modifications
475{
476 // FIXME: outfitId not used in player creating
478 // should check that skin, face, hair* are valid via DBC per race/class
479 // also do it in Player::BuildEnumData, Player::LoadFromDB
480
481 Object::_Create(guidlow, 0, HighGuid::Player);
482
483 m_name = createInfo->Name;
484
485 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class);
486 if (!info)
487 {
488 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid race/class pair ({}/{}) - refusing to do so.",
489 GetSession()->GetAccountId(), m_name, createInfo->Race, createInfo->Class);
490 return false;
491 }
492
493 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; i++)
494 m_items[i] = nullptr;
495
496 Relocate(info->positionX, info->positionY, info->positionZ, info->orientation);
497
498 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class);
499 if (!cEntry)
500 {
501 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid character class ({}) - refusing to do so (wrong DBC-files?)",
502 GetSession()->GetAccountId(), m_name, createInfo->Class);
503 return false;
504 }
505
506 SetMap(sMapMgr->CreateMap(info->mapId, this));
507
508 uint8 powertype = cEntry->powerType;
509
510 SetObjectScale(1.0f);
511
512 m_realRace = createInfo->Race; // set real race flag
513 m_race = createInfo->Race; // set real race flag
514
515 SetFactionForRace(createInfo->Race);
516
517 if (!IsValidGender(createInfo->Gender))
518 {
519 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid gender ({}) - refusing to do so",
520 GetSession()->GetAccountId(), m_name, createInfo->Gender);
521 return false;
522 }
523
524 uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Gender << 16);
525
526 SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24)));
528 if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP)
529 {
532 }
534 SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
535 SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
536
537 // -1 is default value
539
540 SetUInt32Value(PLAYER_BYTES, (createInfo->Skin | (createInfo->Face << 8) | (createInfo->HairStyle << 16) | (createInfo->HairColor << 24)));
542 (0x00 << 8) |
543 (0x00 << 16) |
544 (((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED) << 24)));
545 SetByteValue(PLAYER_BYTES_3, 0, createInfo->Gender);
546 SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1)
547
551
552 for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
553 SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled
555
560
561 // set starting level
563 ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
565
567 {
568 uint32 gm_level = sWorld->getIntConfig(CONFIG_START_GM_LEVEL);
569 if (gm_level > start_level)
570 start_level = gm_level;
571 }
572
573 SetUInt32Value(UNIT_FIELD_LEVEL, start_level);
574
575 InitRunes();
576
578 ? sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)
582
583 // Played time
587
588 // base stats and related field values
593 InitPrimaryProfessions(); // to max set before any spell added
594
595 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
597 {
598 UpdateMaxPower(POWER_MANA); // Update max Mana (for add bonus from intellect)
600 }
601
603 {
608 }
609
610 // original spells
613
614 // original action bar
615 for (PlayerCreateInfoActions::const_iterator action_itr = info->action.begin(); action_itr != info->action.end(); ++action_itr)
616 addActionButton(action_itr->button, action_itr->action, action_itr->type);
617
618 // original items
619 if (CharStartOutfitEntry const* oEntry = GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Gender))
620 {
621 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
622 {
623 if (oEntry->ItemId[j] <= 0)
624 continue;
625
626 uint32 itemId = oEntry->ItemId[j];
627
628 // just skip, reported in ObjectMgr::LoadItemTemplates
629 ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(itemId);
630 if (!iProto)
631 continue;
632
633 // BuyCount by default
634 uint32 count = iProto->BuyCount;
635
636 // special amount for food/drink
637 if (iProto->Class == ITEM_CLASS_CONSUMABLE && iProto->SubClass == ITEM_SUBCLASS_FOOD)
638 {
639 switch (iProto->Spells[0].SpellCategory)
640 {
641 case SPELL_CATEGORY_FOOD: // food
643 break;
644 case SPELL_CATEGORY_DRINK: // drink
645 count = 2;
646 break;
647 }
648 if (iProto->GetMaxStackSize() < count)
649 count = iProto->GetMaxStackSize();
650 }
651 StoreNewItemInBestSlots(itemId, count);
652 }
653 }
654
655 for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr != info->item.end(); ++item_id_itr)
656 StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount);
657
658 // bags and main-hand weapon must equipped at this moment
659 // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
660 // or ammo not equipped in special bag
662 {
663 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
664 {
665 uint16 eDest;
666 // equip offhand weapon/shield if it attempt equipped before main-hand weapon
667 InventoryResult msg = CanEquipItem(NULL_SLOT, eDest, pItem, false);
668 if (msg == EQUIP_ERR_OK)
669 {
671 EquipItem(eDest, pItem, true);
672 }
673 // move other items to more appropriate slots (ammo not equipped in special bag)
674 else
675 {
676 ItemPosCountVec sDest;
677 msg = CanStoreItem(NULL_BAG, NULL_SLOT, sDest, pItem, false);
678 if (msg == EQUIP_ERR_OK)
679 {
681 pItem = StoreItem(sDest, pItem, true);
682 }
683
684 // if this is ammo then use it
685 msg = CanUseAmmo(pItem->GetEntry());
686 if (msg == EQUIP_ERR_OK)
687 SetAmmo(pItem->GetEntry());
688 }
689 }
690 }
691 // all item positions resolved
692
693 // ensure player starts with full health
696
698
699 return true;
700}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition: DBCStores.cpp:842
DBCStorage< ChrClassesEntry > sChrClassesStore(ChrClassesEntryfmt)
@ PLAYER_GUILD_TIMESTAMP
Definition: UpdateFields.h:185
@ PLAYER_GUILDID
Definition: UpdateFields.h:179
@ PLAYER_FIELD_COINAGE
Definition: UpdateFields.h:359
@ UNIT_FIELD_BYTES_0
Definition: UpdateFields.h:95
@ UNIT_FIELD_LEVEL
Definition: UpdateFields.h:114
@ UNIT_MOD_CAST_SPEED
Definition: UpdateFields.h:137
@ PLAYER_GUILDRANK
Definition: UpdateFields.h:180
@ UNIT_FIELD_HOVERHEIGHT
Definition: UpdateFields.h:173
@ UNIT_FIELD_BYTES_2
Definition: UpdateFields.h:161
@ CLASS_CONTEXT_INIT
Definition: UnitDefines.h:227
@ UNIT_FLAG2_REGENERATE_POWER
Definition: UnitDefines.h:299
@ UNIT_BYTE2_FLAG_PVP
Definition: UnitDefines.h:136
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: UnitDefines.h:253
@ REST_STATE_RAF_LINKED
Definition: Player.h:992
@ REST_STATE_NOT_RAF_LINKED
Definition: Player.h:991
@ ITEM_CLASS_CONSUMABLE
Definition: ItemTemplate.h:291
@ ITEM_SUBCLASS_FOOD
Definition: ItemTemplate.h:319
@ CONFIG_START_HEROIC_PLAYER_MONEY
Definition: IWorld.h:241
@ CONFIG_GAME_TYPE
Definition: IWorld.h:218
@ CONFIG_START_GM_LEVEL
Definition: IWorld.h:261
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition: IWorld.h:239
@ CONFIG_START_ARENA_POINTS
Definition: IWorld.h:246
@ CONFIG_START_PLAYER_MONEY
Definition: IWorld.h:240
@ CONFIG_START_PLAYER_LEVEL
Definition: IWorld.h:238
@ CONFIG_START_HONOR_POINTS
Definition: IWorld.h:244
#define MAX_OUTFIT_ITEMS
Definition: DBCStructure.h:617
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:275
@ POWER_RUNE
Definition: SharedDefines.h:274
@ SPELL_CATEGORY_DRINK
Definition: SharedDefines.h:344
@ SPELL_CATEGORY_FOOD
Definition: SharedDefines.h:343
@ REALM_TYPE_RPPVP
Definition: Realm.h:58
@ REALM_TYPE_PVP
Definition: Realm.h:55
uint32 SpellCategory
Definition: ItemTemplate.h:596
void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
Definition: Object.cpp:134
void SetInt32Value(uint16 index, int32 value)
Definition: Object.cpp:637
void SetFloatValue(uint16 index, float value)
Definition: Object.cpp:737
void SetUInt64Value(uint16 index, uint64 value)
Definition: Object.cpp:671
void SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:911
void Relocate(float x, float y)
Definition: Position.h:77
float orientation
Definition: Player.h:350
PlayerCreateInfoActions action
Definition: Player.h:356
PlayerCreateInfoItems item
Definition: Player.h:353
bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count)
Definition: Player.cpp:702
void InitPrimaryProfessions()
Definition: Player.cpp:11458
void InitGlyphsForLevel()
Definition: Player.cpp:13231
void UpdateMaxPower(Powers power) override
Definition: StatSystem.cpp:309
void LearnCustomSpells()
Definition: Player.cpp:11785
void SetArenaPoints(uint32 value)
Definition: Player.cpp:6283
void SetObjectScale(float scale) override
Definition: Player.h:1096
void InitDisplayIds()
Definition: Player.cpp:10567
InventoryResult CanUseAmmo(uint32 item) const
Definition: PlayerStorage.cpp:2462
void SetAmmo(uint32 item)
Definition: PlayerStorage.cpp:2492
void SetHonorPoints(uint32 value)
Definition: Player.cpp:6262
void InitTaxiNodesForLevel()
Definition: Player.h:1162
void InitStatsForLevel(bool reapplyMods=false)
Definition: Player.cpp:2582
Item * EquipItem(uint16 pos, Item *pItem, bool update)
Definition: PlayerStorage.cpp:2727
void InitRunes()
Definition: Player.cpp:13401
void SetMap(Map *map) override
Definition: Player.cpp:14617
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5870
void CheckAllAchievementCriteria()
Definition: Player.cpp:13846
bool HasActivePowerType(Powers power) override
Definition: Player.cpp:2750
void LearnDefaultSkills()
Definition: Player.cpp:11811
void SetFullHealth()
Definition: Unit.h:1047
uint8 m_realRace
Definition: Unit.h:2045
uint8 m_race
Definition: Unit.h:2046
void SetUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:709
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15668
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:703
uint8 HairColor
Definition: WorldSession.h:281
uint8 Skin
Definition: WorldSession.h:278
uint8 Class
Definition: WorldSession.h:276
std::string Name
User specified variables.
Definition: WorldSession.h:274
uint8 FacialHair
Definition: WorldSession.h:282
uint8 HairStyle
Definition: WorldSession.h:280
uint8 Face
Definition: WorldSession.h:279
uint8 Gender
Definition: WorldSession.h:277
uint8 Race
Definition: WorldSession.h:275
Definition: DBCStructure.h:620
Definition: DBCStructure.h:653
uint32 powerType
Definition: DBCStructure.h:656

References Object::_Create(), PlayerInfo::action, addActionButton(), ItemTemplate::BuyCount, CanEquipItem(), CanStoreItem(), CanUseAmmo(), CheckAllAchievementCriteria(), ItemTemplate::Class, CharacterCreateInfo::Class, CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, CONFIG_GAME_TYPE, CONFIG_START_ARENA_POINTS, CONFIG_START_GM_LEVEL, CONFIG_START_HEROIC_PLAYER_LEVEL, CONFIG_START_HEROIC_PLAYER_MONEY, CONFIG_START_HONOR_POINTS, CONFIG_START_PLAYER_LEVEL, CONFIG_START_PLAYER_MONEY, EQUIP_ERR_OK, EquipItem(), CharacterCreateInfo::Face, CharacterCreateInfo::FacialHair, CharacterCreateInfo::Gender, GetCharStartOutfitEntry(), GameTime::GetGameTime(), GetItemByPos(), Unit::GetMaxPower(), ItemTemplate::GetMaxStackSize(), GetSession(), CharacterCreateInfo::HairColor, CharacterCreateInfo::HairStyle, HasActivePowerType(), InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, IsClass(), AccountMgr::IsPlayerAccount(), IsValidGender(), PlayerInfo::item, ITEM_CLASS_CONSUMABLE, ITEM_SUBCLASS_FOOD, KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), LOG_ERROR, m_items, m_Last_tick, WorldObject::m_name, m_Played_time, Unit::m_race, Unit::m_realRace, PlayerInfo::mapId, MAX_OUTFIT_ITEMS, CharacterCreateInfo::Name, NULL_BAG, NULL_SLOT, PlayerInfo::orientation, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_FIELD_COINAGE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_GUILD_TIMESTAMP, PLAYER_GUILDID, PLAYER_GUILDRANK, PLAYER_SLOTS_COUNT, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, POWER_MANA, POWER_RUNE, POWER_RUNIC_POWER, ChrClassesEntry::powerType, CharacterCreateInfo::Race, REALM_TYPE_PVP, REALM_TYPE_RPPVP, Position::Relocate(), RemoveItem(), REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, sChrClassesStore, SetAmmo(), SetArenaPoints(), Object::SetByteFlag(), Object::SetByteValue(), SetFactionForRace(), Object::SetFloatValue(), Unit::SetFullHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetUInt32Value(), Object::SetUInt64Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), CharacterCreateInfo::Skin, sMapMgr, sObjectMgr, SPELL_CATEGORY_DRINK, SPELL_CATEGORY_FOOD, _Spell::SpellCategory, ItemTemplate::Spells, StoreItem(), StoreNewItemInBestSlots(), ItemTemplate::SubClass, sWorld, UNIT_BYTE2_FLAG_PVP, UNIT_FIELD_BYTES_0, UNIT_FIELD_BYTES_2, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MOD_CAST_SPEED, UpdateAllStats(), and UpdateMaxPower().

◆ CreateCorpse()

Corpse * Player::CreateCorpse ( )
4601{
4602 // prevent existence 2 corpse for player
4604
4605 uint32 _uf, _pb, _pb2, _cfb1, _cfb2;
4606
4608 SetPvPDeath(false);
4609
4610 if (!corpse->Create(GetMap()->GenerateLowGuid<HighGuid::Corpse>(), this))
4611 {
4612 delete corpse;
4613 return nullptr;
4614 }
4615
4617
4618 _uf = getRace();
4621
4622 uint8 race = (uint8)(_uf);
4623 uint8 skin = (uint8)(_pb);
4624 uint8 face = (uint8)(_pb >> 8);
4625 uint8 hairstyle = (uint8)(_pb >> 16);
4626 uint8 haircolor = (uint8)(_pb >> 24);
4627 uint8 facialhair = (uint8)(_pb2);
4628
4629 _cfb1 = ((0x00) | (race << 8) | (GetByteValue(PLAYER_BYTES_3, 0) << 16) | (skin << 24));
4630 _cfb2 = ((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24));
4631
4632 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1);
4633 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_2, _cfb2);
4634
4635 uint32 flags = CORPSE_FLAG_UNK2;
4637 flags |= CORPSE_FLAG_HIDE_HELM;
4639 flags |= CORPSE_FLAG_HIDE_CLOAK;
4640
4641 // Xinef: Player can loop corpses while in BG or in WG
4642 if (InBattleground() && !InArena())
4643 flags |= CORPSE_FLAG_LOOTABLE;
4644 Battlefield* Bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
4645 if (Bf && Bf->IsWarTime())
4646 flags |= CORPSE_FLAG_LOOTABLE;
4647
4648 corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags);
4649
4651
4653
4654 uint32 iDisplayID;
4655 uint32 iIventoryType;
4656 uint32 _cfi;
4657 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++)
4658 {
4659 if (m_items[i])
4660 {
4661 iDisplayID = m_items[i]->GetTemplate()->DisplayInfoID;
4662 iIventoryType = m_items[i]->GetTemplate()->InventoryType;
4663
4664 _cfi = iDisplayID | (iIventoryType << 24);
4665 corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, _cfi);
4666 }
4667 }
4668
4669 // register for player, but not show
4670 GetMap()->AddCorpse(corpse);
4671
4673
4674 // we do not need to save corpses for BG/arenas
4675 if (!GetMap()->IsBattlegroundOrArena())
4676 corpse->SaveToDB();
4677
4678 return corpse;
4679}
@ CORPSE_FIELD_BYTES_2
Definition: UpdateFields.h:425
@ CORPSE_FIELD_FLAGS
Definition: UpdateFields.h:427
@ CORPSE_FIELD_BYTES_1
Definition: UpdateFields.h:424
@ CORPSE_FIELD_DISPLAY_ID
Definition: UpdateFields.h:422
@ CORPSE_FIELD_ITEM
Definition: UpdateFields.h:423
@ CORPSE_FIELD_GUILD
Definition: UpdateFields.h:426
@ CORPSE_RESURRECTABLE_PVE
Definition: Corpse.h:29
@ CORPSE_FLAG_HIDE_CLOAK
Definition: Corpse.h:44
@ CORPSE_FLAG_UNK2
Definition: Corpse.h:42
@ CORPSE_FLAG_HIDE_HELM
Definition: Corpse.h:43
@ CORPSE_FLAG_LOOTABLE
Definition: Corpse.h:45
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
@ BATTLEFIELD_BATTLEID_WG
Definition: Battlefield.h:35
Definition: Battlefield.h:204
bool IsWarTime()
Return true if battle is start, false if battle is not started.
Definition: Battlefield.h:247
void SaveToDB()
Definition: Corpse.cpp:90
bool Create(ObjectGuid::LowType guidlow)
Definition: Corpse.cpp:61
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:650
void UpdatePositionData()
Definition: Object.cpp:1165
void WorldRelocate(const WorldLocation &loc)
Definition: Position.h:263
WorldLocation _corpseLocation
Definition: Player.h:3014
void SpawnCorpseBones(bool triggerSave=true)
Definition: Player.cpp:4695
void SetPvPDeath(bool on)
Definition: Player.h:1186
bool InArena() const
Definition: Player.cpp:12245
uint32 GetNativeDisplayId() const
Definition: Unit.h:1880
void AddCorpse(Corpse *corpse)
Definition: Map.cpp:2781

References _corpseLocation, Map::AddCorpse(), BATTLEFIELD_BATTLEID_WG, CORPSE_FIELD_BYTES_1, CORPSE_FIELD_BYTES_2, CORPSE_FIELD_DISPLAY_ID, CORPSE_FIELD_FLAGS, CORPSE_FIELD_GUILD, CORPSE_FIELD_ITEM, CORPSE_FLAG_HIDE_CLOAK, CORPSE_FLAG_HIDE_HELM, CORPSE_FLAG_LOOTABLE, CORPSE_FLAG_UNK2, CORPSE_RESURRECTABLE_PVE, CORPSE_RESURRECTABLE_PVP, Corpse::Create(), ItemTemplate::DisplayInfoID, EQUIPMENT_SLOT_END, Object::GetByteValue(), GetGuildId(), WorldObject::GetMap(), Unit::GetNativeDisplayId(), Unit::getRace(), Item::GetTemplate(), Object::GetUInt32Value(), HasPlayerFlag(), InArena(), InBattleground(), ItemTemplate::InventoryType, Battlefield::IsWarTime(), m_ExtraFlags, m_items, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_EXTRA_PVP_DEATH, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, Corpse::SaveToDB(), sBattlefieldMgr, SetPvPDeath(), Object::SetUInt32Value(), SpawnCorpseBones(), WorldObject::UpdatePositionData(), and WorldLocation::WorldRelocate().

Referenced by BuildPlayerRepop().

◆ CreatePet() [1/2]

Pet * Player::CreatePet ( Creature creatureTarget,
uint32  spellID = 0 
)
9214{
9215 if (IsExistPet())
9216 {
9217 return nullptr;
9218 }
9219
9220 if (!creatureTarget || creatureTarget->IsPet() || creatureTarget->IsPlayer())
9221 {
9222 return nullptr;
9223 }
9224
9225 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
9226 if (!creatrueTemplate->family)
9227 {
9228 // Creatures with family 0 crashes the server
9229 return nullptr;
9230 }
9231
9232 // Everything looks OK, create new pet
9233 Pet* pet = CreateTamedPetFrom(creatureTarget, spellID);
9234 if (!pet)
9235 {
9236 return nullptr;
9237 }
9238
9239 // "kill" original creature
9240 creatureTarget->DespawnOrUnsummon();
9241
9242 // calculate proper level
9243 uint8 level = (creatureTarget->GetLevel() < (GetLevel() - 5)) ? (GetLevel() - 5) : GetLevel();
9244
9245 // prepare visual effect for levelup
9246 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
9247
9248 // add to world
9249 pet->GetMap()->AddToMap(pet->ToCreature());
9250
9251 // visual effect for levelup
9252 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
9253
9254 // caster have pet now
9255 SetMinion(pet, true);
9256
9257 pet->InitTalentForLevel();
9258
9261
9262 return pet;
9263}
void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer)
Definition: Creature.cpp:2177
uint32 family
Definition: CreatureData.h:217
void InitTalentForLevel()
Definition: Pet.cpp:2222
void SavePetToDB(PetSaveMode mode)
Definition: Pet.cpp:502
bool IsExistPet()
Definition: Player.cpp:9207
void PetSpellInitialize()
Definition: Player.cpp:9480
void SetMinion(Minion *minion, bool apply)
Definition: Unit.cpp:10729
Pet * CreateTamedPetFrom(Creature *creatureTarget, uint32 spell_id=0)
Definition: Unit.cpp:17384
bool IsPet() const
Definition: Unit.h:747

References Map::AddToMap(), Unit::CreateTamedPetFrom(), Creature::DespawnOrUnsummon(), CreatureTemplate::family, Object::GetEntry(), Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), Unit::IsPet(), Object::IsPlayer(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

Referenced by npc_commandscript::HandleNpcTameCommand(), and pet_commandscript::HandlePetCreateCommand().

◆ CreatePet() [2/2]

Pet * Player::CreatePet ( uint32  creatureEntry,
uint32  spellID = 0 
)
9266{
9267 if (IsExistPet())
9268 {
9269 return nullptr;
9270 }
9271
9272 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureEntry);
9273 if (!creatrueTemplate->family)
9274 {
9275 // Creatures with family 0 crashes the server
9276 return nullptr;
9277 }
9278
9279 // Everything looks OK, create new pet
9280 Pet* pet = CreateTamedPetFrom(creatureEntry, spellID);
9281 if (!pet)
9282 {
9283 return nullptr;
9284 }
9285
9286 // prepare visual effect for levelup
9288
9289 // add to world
9290 pet->GetMap()->AddToMap(pet->ToCreature());
9291
9292 // visual effect for levelup
9294
9295 // caster have pet now
9296 SetMinion(pet, true);
9297
9298 pet->InitTalentForLevel();
9299
9302
9303 return pet;
9304}

References Map::AddToMap(), Unit::CreateTamedPetFrom(), CreatureTemplate::family, Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

◆ Customize()

void Player::Customize ( CharacterCustomizeInfo const *  customizeInfo,
CharacterDatabaseTransaction  trans 
)
static
115{
117 stmt->SetData(0, customizeInfo->Gender);
118 stmt->SetData(1, customizeInfo->Skin);
119 stmt->SetData(2, customizeInfo->Face);
120 stmt->SetData(3, customizeInfo->HairStyle);
121 stmt->SetData(4, customizeInfo->HairColor);
122 stmt->SetData(5, customizeInfo->FacialHair);
123 stmt->SetData(6, customizeInfo->Guid.GetCounter());
124
125 CharacterDatabase.ExecuteOrAppend(trans, stmt);
126}
@ CHAR_UPD_GENDER_AND_APPEARANCE
Definition: CharacterDatabase.h:317

References CHAR_UPD_GENDER_AND_APPEARANCE, CharacterDatabase, CharacterCustomizeInfo::Face, CharacterCustomizeInfo::FacialHair, CharacterCustomizeInfo::Gender, ObjectGuid::GetCounter(), CharacterRenameInfo::Guid, CharacterCustomizeInfo::HairColor, CharacterCustomizeInfo::HairStyle, PreparedStatementBase::SetData(), and CharacterCustomizeInfo::Skin.

Referenced by WorldSession::HandleCharCustomizeCallback(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ DeleteEquipmentSet()

void Player::DeleteEquipmentSet ( uint64  setGuid)
14565{
14566 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14567 {
14568 if (itr->second.Guid == setGuid)
14569 {
14570 if (itr->second.state == EQUIPMENT_SET_NEW)
14571 m_EquipmentSets.erase(itr);
14572 else
14573 itr->second.state = EQUIPMENT_SET_DELETED;
14574 break;
14575 }
14576 }
14577}

References EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, and m_EquipmentSets.

Referenced by WorldSession::HandleEquipmentSetDelete().

◆ DeleteFromDB()

void Player::DeleteFromDB ( ObjectGuid::LowType  lowGuid,
uint32  accountId,
bool  updateRealmChars,
bool  deleteFinally 
)
static

Deletes a character from the database

The way, how the characters will be deleted is decided based on the config option.

Parameters
playerguidthe low-GUID from the player which should be deleted
accountIdthe account id from the player
updateRealmCharswhen this flag is set, the amount of characters on that realm will be updated in the realmlist
deleteFinallyif this flag is set, the config option will be ignored and the character will be permanently removed from the database
3976{
3977 // for not existed account avoid update realm
3978 if (!accountId)
3979 updateRealmChars = false;
3980
3981 ObjectGuid playerGuid = ObjectGuid::Create<HighGuid::Player>(lowGuid);
3982
3983 uint32 charDelete_method = sWorld->getIntConfig(CONFIG_CHARDELETE_METHOD);
3984 uint32 charDelete_minLvl = sWorld->getIntConfig(CONFIG_CHARDELETE_MIN_LEVEL);
3985
3986 // if we want to finally delete the character or the character does not meet the level requirement,
3987 // we set it to mode CHAR_DELETE_REMOVE
3988 if (deleteFinally || sCharacterCache->GetCharacterLevelByGuid(playerGuid) < charDelete_minLvl)
3989 charDelete_method = CHAR_DELETE_REMOVE;
3990
3991 if (uint32 guildId = sCharacterCache->GetCharacterGuildIdByGuid(playerGuid))
3992 if (Guild* guild = sGuildMgr->GetGuildById(guildId))
3993 guild->DeleteMember(playerGuid, false, false, true);
3994
3995 // remove from arena teams
3996 LeaveAllArenaTeams(playerGuid);
3997
3998 // close player ticket if any
3999 GmTicket* ticket = sTicketMgr->GetTicketByPlayer(playerGuid);
4000 if (ticket)
4001 sTicketMgr->CloseTicket(ticket->GetId(), playerGuid);
4002
4003 // remove from group
4004 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(playerGuid))
4005 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
4006 RemoveFromGroup(group, playerGuid);
4007
4008 // Remove signs from petitions (also remove petitions if owner);
4009 RemovePetitionsAndSigns(playerGuid, 10);
4010
4011 CharacterDatabasePreparedStatement* stmt = nullptr;
4012
4013 switch (charDelete_method)
4014 {
4015 // Completely remove from the database
4016 case CHAR_DELETE_REMOVE:
4017 {
4018 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4019
4020 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL);
4021 stmt->SetData(0, lowGuid);
4022 PreparedQueryResult resultMail = CharacterDatabase.Query(stmt);
4023
4024 if (resultMail)
4025 {
4026 std::unordered_map<uint32, std::vector<Item*>> itemsByMail;
4027
4028 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
4029 stmt->SetData(0, lowGuid);
4030 PreparedQueryResult resultItems = CharacterDatabase.Query(stmt);
4031
4032 if (resultItems)
4033 {
4034 do
4035 {
4036 Field* fields = resultItems->Fetch();
4037 uint32 mailId = fields[14].Get<uint32>();
4038 if (Item* mailItem = _LoadMailedItem(playerGuid, nullptr, mailId, nullptr, fields))
4039 {
4040 itemsByMail[mailId].push_back(mailItem);
4041 }
4042 } while (resultItems->NextRow());
4043 }
4044
4045 do
4046 {
4047 Field* mailFields = resultMail->Fetch();
4048
4049 uint32 mail_id = mailFields[0].Get<uint32>();
4050 uint8 mailType = mailFields[1].Get<uint8>();
4051 uint16 mailTemplateId = mailFields[2].Get<uint16>();
4052 uint32 sender = mailFields[3].Get<uint32>();
4053 std::string subject = mailFields[4].Get<std::string>();
4054 std::string body = mailFields[5].Get<std::string>();
4055 uint32 money = mailFields[6].Get<uint32>();
4056 bool has_items = mailFields[7].Get<bool>();
4057
4058 // We can return mail now
4059 // So firstly delete the old one
4060 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
4061 stmt->SetData(0, mail_id);
4062 trans->Append(stmt);
4063
4064 // Mail is not from player
4065 if (mailType != MAIL_NORMAL)
4066 {
4067 if (has_items)
4068 {
4069 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4070 stmt->SetData(0, mail_id);
4071 trans->Append(stmt);
4072 }
4073 continue;
4074 }
4075
4076 MailDraft draft(subject, body);
4077 if (mailTemplateId)
4078 draft = MailDraft(mailTemplateId, false); // items are already included
4079
4080 auto itemsItr = itemsByMail.find(mail_id);
4081 if (itemsItr != itemsByMail.end())
4082 {
4083 for (Item* item : itemsItr->second)
4084 {
4085 draft.AddItem(item);
4086 }
4087
4088 // MailDraft will take care of freeing memory.
4089 itemsByMail.erase(itemsItr);
4090 }
4091
4092 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4093 stmt->SetData(0, mail_id);
4094 trans->Append(stmt);
4095
4096 uint32 pl_account = sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid(HighGuid::Player, lowGuid));
4097
4098 draft.AddMoney(money).SendReturnToSender(pl_account, lowGuid, sender, trans);
4099 } while (resultMail->NextRow());
4100 }
4101
4102 // Unsummon and delete for pets in world is not required: player deleted from CLI or character list with not loaded pet.
4103 // NOW we can finally clear other DB data related to character
4104 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_IDS);
4105 stmt->SetData(0, lowGuid);
4106 PreparedQueryResult resultPets = CharacterDatabase.Query(stmt);
4107
4108 if (resultPets)
4109 {
4110 do
4111 {
4112 ObjectGuid::LowType petguidlow = (*resultPets)[0].Get<uint32>();
4113 Pet::DeleteFromDB(petguidlow);
4114 } while (resultPets->NextRow());
4115 }
4116
4117 // Delete char from social list of online chars
4118 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_SOCIAL);
4119 stmt->SetData(0, lowGuid);
4120 PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt);
4121
4122 if (resultFriends)
4123 {
4124 do
4125 {
4126 if (Player* pFriend = ObjectAccessor::FindPlayerByLowGUID((*resultFriends)[0].Get<uint32>()))
4127 {
4128 pFriend->GetSocial()->RemoveFromSocialList(playerGuid, SOCIAL_FLAG_ALL);
4129 sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, playerGuid, false);
4130 }
4131 } while (resultFriends->NextRow());
4132 }
4133
4134 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER);
4135 stmt->SetData(0, lowGuid);
4136 trans->Append(stmt);
4137
4138 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA);
4139 stmt->SetData(0, lowGuid);
4140 trans->Append(stmt);
4141
4142 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME);
4143 stmt->SetData(0, lowGuid);
4144 trans->Append(stmt);
4145
4146 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION);
4147 stmt->SetData(0, lowGuid);
4148 trans->Append(stmt);
4149
4150 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
4151 stmt->SetData(0, lowGuid);
4152 trans->Append(stmt);
4153
4154 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GIFT);
4155 stmt->SetData(0, lowGuid);
4156 trans->Append(stmt);
4157
4158 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND);
4159 stmt->SetData(0, lowGuid);
4160 trans->Append(stmt);
4161
4162 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE);
4163 stmt->SetData(0, lowGuid);
4164 trans->Append(stmt);
4165
4166 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY);
4167 stmt->SetData(0, lowGuid);
4168 trans->Append(stmt);
4169
4170 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS);
4171 stmt->SetData(0, lowGuid);
4172 trans->Append(stmt);
4173
4174 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED);
4175 stmt->SetData(0, lowGuid);
4176 trans->Append(stmt);
4177
4178 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION);
4179 stmt->SetData(0, lowGuid);
4180 trans->Append(stmt);
4181
4182 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL);
4183 stmt->SetData(0, lowGuid);
4184 trans->Append(stmt);
4185
4186 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN);
4187 stmt->SetData(0, lowGuid);
4188 trans->Append(stmt);
4189
4190 if (sWorld->getBoolConfig(CONFIG_DELETE_CHARACTER_TICKET_TRACE))
4191 {
4193 stmt->SetData(0, lowGuid);
4194 trans->Append(stmt);
4195 }
4196 else
4197 {
4198 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_GM_TICKETS);
4199 stmt->SetData(0, lowGuid);
4200 trans->Append(stmt);
4201 }
4202
4203 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER);
4204 stmt->SetData(0, lowGuid);
4205 trans->Append(stmt);
4206
4207 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND);
4208 stmt->SetData(0, lowGuid);
4209 trans->Append(stmt);
4210
4211 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID);
4212 stmt->SetData(0, lowGuid);
4213 trans->Append(stmt);
4214
4215 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL);
4216 stmt->SetData(0, lowGuid);
4217 trans->Append(stmt);
4218
4219 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEMS);
4220 stmt->SetData(0, lowGuid);
4221 trans->Append(stmt);
4222
4223 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_OWNER);
4224 stmt->SetData(0, lowGuid);
4225 trans->Append(stmt);
4226
4228 stmt->SetData(0, lowGuid);
4229 trans->Append(stmt);
4230
4231 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENTS);
4232 stmt->SetData(0, lowGuid);
4233 trans->Append(stmt);
4234
4235 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS);
4236 stmt->SetData(0, lowGuid);
4237 trans->Append(stmt);
4238
4239 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_EQUIPMENTSETS);
4240 stmt->SetData(0, lowGuid);
4241 trans->Append(stmt);
4242
4243 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER);
4244 stmt->SetData(0, lowGuid);
4245 stmt->SetData(1, lowGuid);
4246 trans->Append(stmt);
4247
4248 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER);
4249 stmt->SetData(0, lowGuid);
4250 trans->Append(stmt);
4251
4252 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ENTRY_POINT);
4253 stmt->SetData(0, lowGuid);
4254 trans->Append(stmt);
4255
4256 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS);
4257 stmt->SetData(0, lowGuid);
4258 trans->Append(stmt);
4259
4260 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
4261 stmt->SetData(0, lowGuid);
4262 trans->Append(stmt);
4263
4264 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
4265 stmt->SetData(0, lowGuid);
4266 trans->Append(stmt);
4267
4268 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR);
4269 stmt->SetData(0, lowGuid);
4270 trans->Append(stmt);
4271
4272 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
4273 stmt->SetData(0, lowGuid);
4274 trans->Append(stmt);
4275
4276 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT);
4277 stmt->SetData(0, lowGuid);
4278 trans->Append(stmt);
4279
4280 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILLS);
4281 stmt->SetData(0, lowGuid);
4282 trans->Append(stmt);
4283
4284 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SETTINGS);
4285 stmt->SetData(0, lowGuid);
4286 trans->Append(stmt);
4287
4288 Corpse::DeleteFromDB(playerGuid, trans);
4289
4290 sScriptMgr->OnPlayerDeleteFromDB(trans, lowGuid);
4291
4292 CharacterDatabase.CommitTransaction(trans);
4293 break;
4294 }
4295 // The character gets unlinked from the account, the name gets freed up and appears as deleted ingame
4296 case CHAR_DELETE_UNLINK:
4297 {
4298 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DELETE_INFO);
4299
4300 stmt->SetData(0, lowGuid);
4301
4302 CharacterDatabase.Execute(stmt);
4303 break;
4304 }
4305 default:
4306 LOG_ERROR("entities.player", "Player::DeleteFromDB: Unsupported delete method: {}.", charDelete_method);
4307 return;
4308 }
4309
4310 if (CharacterCacheEntry const* cache = sCharacterCache->GetCharacterCacheByGuid(playerGuid))
4311 {
4312 std::string name = cache->Name;
4313 sCharacterCache->DeleteCharacterCacheEntry(playerGuid, name);
4314 }
4315
4316 if (updateRealmChars)
4317 {
4318 sWorld->UpdateRealmCharCount(accountId);
4319 }
4320}
@ MAIL_NORMAL
Definition: Mail.h:37
@ FRIEND_REMOVED
Definition: SocialMgr.h:71
#define sSocialMgr
Definition: SocialMgr.h:147
@ SOCIAL_FLAG_ALL
Definition: SocialMgr.h:44
@ CHAR_DELETE_REMOVE
Definition: Player.h:959
@ CHAR_DELETE_UNLINK
Definition: Player.h:960
#define sTicketMgr
Definition: TicketMgr.h:260
#define sGuildMgr
Definition: GuildMgr.h:51
@ CONFIG_CHARDELETE_METHOD
Definition: IWorld.h:358
@ CONFIG_CHARDELETE_MIN_LEVEL
Definition: IWorld.h:359
@ CONFIG_DELETE_CHARACTER_TICKET_TRACE
Definition: IWorld.h:133
@ CHAR_DEL_CHAR_SOCIAL_BY_FRIEND
Definition: CharacterDatabase.h:395
@ CHAR_DEL_CHAR_GIFT
Definition: CharacterDatabase.h:410
@ CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER
Definition: CharacterDatabase.h:478
@ CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER
Definition: CharacterDatabase.h:421
@ CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER
Definition: CharacterDatabase.h:420
@ CHAR_DEL_CHAR_SKILLS
Definition: CharacterDatabase.h:424
@ CHAR_DEL_CHAR_PET_BY_OWNER
Definition: CharacterDatabase.h:477
@ CHAR_DEL_ITEM_INSTANCE_BY_OWNER
Definition: CharacterDatabase.h:128
@ CHAR_DEL_CHAR_DECLINED_NAME
Definition: CharacterDatabase.h:386
@ CHAR_SEL_MAILITEMS
Definition: CharacterDatabase.h:101
@ CHAR_UPD_DELETE_INFO
Definition: CharacterDatabase.h:294
@ CHAR_DEL_CHAR_EQUIPMENTSETS
Definition: CharacterDatabase.h:419
@ CHAR_DEL_PLAYER_ACCOUNT_DATA
Definition: CharacterDatabase.h:203
@ CHAR_DEL_MAIL
Definition: CharacterDatabase.h:416
@ CHAR_DEL_CHAR_TALENT
Definition: CharacterDatabase.h:423
@ CHAR_SEL_CHAR_SOCIAL
Definition: CharacterDatabase.h:350
@ CHAR_DEL_CHAR_INVENTORY
Definition: CharacterDatabase.h:412
@ CHAR_DEL_CHAR_QUESTSTATUS
Definition: CharacterDatabase.h:393
@ CHAR_DEL_CHAR_ACTION
Definition: CharacterDatabase.h:408
@ CHAR_SEL_CHAR_PET_IDS
Definition: CharacterDatabase.h:480
@ CHAR_DEL_CHAR_ACHIEVEMENTS
Definition: CharacterDatabase.h:418
@ CHAR_SEL_CHAR_COD_ITEM_MAIL
Definition: CharacterDatabase.h:349
@ CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION
Definition: CharacterDatabase.h:267
@ CHAR_DEL_CHAR_REPUTATION
Definition: CharacterDatabase.h:414
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS
Definition: CharacterDatabase.h:366
@ CHAR_DEL_CHARACTER
Definition: CharacterDatabase.h:407
@ CHAR_DEL_CHAR_SOCIAL_BY_GUID
Definition: CharacterDatabase.h:394
@ CHAR_DEL_CHAR_SETTINGS
Definition: CharacterDatabase.h:524
@ CHAR_DEL_CHAR_SPELL
Definition: CharacterDatabase.h:415
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED
Definition: CharacterDatabase.h:413
@ CHAR_DEL_PLAYER_GM_TICKETS
Definition: CharacterDatabase.h:266
@ CHAR_DEL_MAIL_ITEMS
Definition: CharacterDatabase.h:417
@ CHAR_DEL_CHAR_INSTANCE
Definition: CharacterDatabase.h:411
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition: ObjectAccessor.cpp:251
Definition: CharacterCache.h:28
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition: Corpse.cpp:119
void DeleteFromDB() override
Definition: Pet.h:171
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Player.cpp:2351
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition: Player.cpp:10056
static void LeaveAllArenaTeams(ObjectGuid guid)
Definition: Player.cpp:10124
Definition: Guild.h:292
Definition: TicketMgr.h:88
uint32 GetId() const
Definition: TicketMgr.h:101

References _LoadMailedItem(), MailDraft::AddItem(), MailDraft::AddMoney(), CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, CHAR_DEL_CHAR_ACHIEVEMENTS, CHAR_DEL_CHAR_ACTION, CHAR_DEL_CHAR_AURA, CHAR_DEL_CHAR_DECLINED_NAME, CHAR_DEL_CHAR_EQUIPMENTSETS, CHAR_DEL_CHAR_GIFT, CHAR_DEL_CHAR_GLYPHS, CHAR_DEL_CHAR_INSTANCE, CHAR_DEL_CHAR_INVENTORY, CHAR_DEL_CHAR_PET_BY_OWNER, CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, CHAR_DEL_CHAR_QUESTSTATUS, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, CHAR_DEL_CHAR_REPUTATION, CHAR_DEL_CHAR_SETTINGS, CHAR_DEL_CHAR_SKILLS, CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, CHAR_DEL_CHAR_SOCIAL_BY_GUID, CHAR_DEL_CHAR_SPELL, CHAR_DEL_CHAR_SPELL_COOLDOWN, CHAR_DEL_CHAR_TALENT, CHAR_DEL_CHARACTER, CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, CHAR_DEL_ITEM_INSTANCE_BY_OWNER, CHAR_DEL_MAIL, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_DEL_MAIL_ITEMS, CHAR_DEL_PLAYER_ACCOUNT_DATA, CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_DEL_PLAYER_GM_TICKETS, CHAR_DEL_PLAYER_HOMEBIND, CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_DELETE_REMOVE, CHAR_DELETE_UNLINK, CHAR_SEL_CHAR_COD_ITEM_MAIL, CHAR_SEL_CHAR_PET_IDS, CHAR_SEL_CHAR_SOCIAL, CHAR_SEL_MAILITEMS, CHAR_UPD_DELETE_INFO, CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION, CharacterDatabase, CONFIG_CHARDELETE_METHOD, CONFIG_CHARDELETE_MIN_LEVEL, CONFIG_DELETE_CHARACTER_TICKET_TRACE, Pet::DeleteFromDB(), Corpse::DeleteFromDB(), ObjectAccessor::FindPlayerByLowGUID(), FRIEND_REMOVED, Field::Get(), GmTicket::GetId(), LeaveAllArenaTeams(), LOG_ERROR, MAIL_NORMAL, RemoveFromGroup(), RemovePetitionsAndSigns(), sCharacterCache, MailDraft::SendReturnToSender(), PreparedStatementBase::SetData(), sGroupMgr, sGuildMgr, SOCIAL_FLAG_ALL, sScriptMgr, sSocialMgr, sTicketMgr, and sWorld.

Referenced by AccountMgr::DeleteAccount(), DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedDeleteCommand(), character_commandscript::HandleCharacterEraseCommand(), and WorldSession::HandleCharDeleteOpcode().

◆ DeleteOldCharacters() [1/2]

void Player::DeleteOldCharacters ( )
static

Characters which were kept back in the database after being deleted and are now too old (see config option "CharDelete.KeepDays"), will be completely deleted.

4326{
4327 uint32 keepDays = sWorld->getIntConfig(CONFIG_CHARDELETE_KEEP_DAYS);
4328 if (!keepDays)
4329 return;
4330
4332}
@ CONFIG_CHARDELETE_KEEP_DAYS
Definition: IWorld.h:357
static void DeleteOldCharacters()
Definition: Player.cpp:4325

References CONFIG_CHARDELETE_KEEP_DAYS, DeleteOldCharacters(), and sWorld.

Referenced by DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedPurgeCommand(), and World::SetInitialWorldSettings().

◆ DeleteOldCharacters() [2/2]

void Player::DeleteOldCharacters ( uint32  keepDays)
static

Characters which were kept back in the database after being deleted and are older than the specified amount of days, will be completely deleted.

4338{
4339 LOG_INFO("server.loading", "Player::DeleteOldChars: Deleting all characters which have been deleted {} days before...", keepDays);
4340 LOG_INFO("server.loading", " ");
4341
4343 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4344 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4345
4346 if (result)
4347 {
4348 LOG_INFO("server.loading", "Player::DeleteOldChars: Found {} character(s) to delete", result->GetRowCount());
4349 do
4350 {
4351 Field* fields = result->Fetch();
4352 Player::DeleteFromDB(fields[0].Get<uint32>(), fields[1].Get<uint32>(), true, true);
4353 } while (result->NextRow());
4354 }
4355}
@ CHAR_SEL_CHAR_OLD_CHARS
Definition: CharacterDatabase.h:351
constexpr auto DAY
Definition: Common.h:49
static void DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
Definition: Player.cpp:3975

References CHAR_SEL_CHAR_OLD_CHARS, CharacterDatabase, DAY, DeleteFromDB(), GameTime::GetGameTime(), LOG_INFO, and PreparedStatementBase::SetData().

◆ DeleteOldRecoveryItems() [1/2]

void Player::DeleteOldRecoveryItems ( )
static

Items which were kept back in the database after being deleted and are now too old (see config option "ItemDelete.KeepDays"), will be completely deleted.

4361{
4362 uint32 keepDays = sWorld->getIntConfig(CONFIG_ITEMDELETE_KEEP_DAYS);
4363 if (!keepDays)
4364 return;
4365
4367}
@ CONFIG_ITEMDELETE_KEEP_DAYS
Definition: IWorld.h:392
static void DeleteOldRecoveryItems()
Definition: Player.cpp:4360

References CONFIG_ITEMDELETE_KEEP_DAYS, DeleteOldRecoveryItems(), and sWorld.

Referenced by DeleteOldRecoveryItems(), and World::SetInitialWorldSettings().

◆ DeleteOldRecoveryItems() [2/2]

void Player::DeleteOldRecoveryItems ( uint32  keepDays)
static

Items which were kept back in the database after being deleted and are older than the specified amount of days, will be completely deleted.

4373{
4374 LOG_INFO("server.loading", "Player::DeleteOldRecoveryItems: Deleting all items which have been deleted {} days before...", keepDays);
4375 LOG_INFO("server.loading", " ");
4376
4378 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4379 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4380
4381 if (result)
4382 {
4383 LOG_INFO("server.loading", "Player::DeleteOldRecoveryItems: Found {} item(s) to delete", result->GetRowCount());
4384 do
4385 {
4386 Field* fields = result->Fetch();
4387
4388 uint32 guid = fields[0].Get<uint32>();
4389 uint32 itemEntry = fields[1].Get<uint32>();
4390
4392 deleteStmt->SetData(0, guid);
4393 CharacterDatabase.Execute(deleteStmt);
4394
4395 LOG_INFO("server.loading", "Deleted item from recovery_item table where guid {} and item id {}", guid, itemEntry);
4396 } while (result->NextRow());
4397 }
4398}
@ CHAR_SEL_RECOVERY_ITEM_OLD_ITEMS
Definition: CharacterDatabase.h:513
@ CHAR_DEL_RECOVERY_ITEM_BY_GUID
Definition: CharacterDatabase.h:514

References CHAR_DEL_RECOVERY_ITEM_BY_GUID, CHAR_SEL_RECOVERY_ITEM_OLD_ITEMS, CharacterDatabase, DAY, Field::Get(), GameTime::GetGameTime(), LOG_INFO, and PreparedStatementBase::SetData().

◆ DeleteRefundReference()

void Player::DeleteRefundReference ( ObjectGuid  itemGUID)
15455{
15456 RefundableItemsSet::iterator itr = m_refundableItems.find(itemGUID);
15457 if (itr != m_refundableItems.end())
15458 m_refundableItems.erase(itr);
15459}

References m_refundableItems.

Referenced by _SaveInventory(), Item::SetNotRefundable(), and Item::SetState().

◆ DestroyConjuredItems()

void Player::DestroyConjuredItems ( bool  update)
3343{
3344 // used when entering arena
3345 // destroys all conjured items
3346 LOG_DEBUG("entities.player.items", "STORAGE: DestroyConjuredItems");
3347
3348 // in inventory
3350 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3351 if (pItem->IsConjuredConsumable())
3353
3354 // in inventory bags
3356 if (Bag* pBag = GetBagByPos(i))
3357 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3358 if (Item* pItem = pBag->GetItemByPos(j))
3359 if (pItem->IsConjuredConsumable())
3360 DestroyItem(i, j, update);
3361
3362 // in equipment and bag list
3364 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3365 if (pItem->IsConjuredConsumable())
3367}

References DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and LOG_DEBUG.

Referenced by Battleground::AddPlayer().

◆ DestroyForPlayer()

void Player::DestroyForPlayer ( Player target,
bool  onDeath = false 
) const
overridevirtual

Reimplemented from Object.

3849{
3850 Unit::DestroyForPlayer(target, onDeath);
3851
3852 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) // xinef: previously INVENTORY_SLOT_BAG_END
3853 {
3854 if (!m_items[i])
3855 continue;
3856
3857 m_items[i]->DestroyForPlayer(target);
3858 }
3859
3860 if (target == this)
3861 {
3863 {
3864 if (!m_items[i])
3865 continue;
3866
3867 m_items[i]->DestroyForPlayer(target);
3868 }
3870 {
3871 if (!m_items[i])
3872 continue;
3873
3874 m_items[i]->DestroyForPlayer(target);
3875 }
3876 }
3877}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, Object::DestroyForPlayer(), EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

◆ DestroyItem()

void Player::DestroyItem ( uint8  bag,
uint8  slot,
bool  update 
)
3024{
3025 Item* pItem = GetItemByPos(bag, slot);
3026 if (pItem)
3027 {
3028 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
3029 // Also remove all contained items if the item is a bag.
3030 // This if () prevents item saving crashes if the condition for a bag to be empty before being destroyed was bypassed somehow.
3031 if (pItem->IsNotEmptyBag())
3032 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
3033 DestroyItem(slot, i, update);
3034
3035 if (pItem->IsWrapped())
3036 {
3038 stmt->SetData(0, pItem->GetGUID().GetCounter());
3039 CharacterDatabase.Execute(stmt);
3040 }
3041
3043 RemoveItemDurations(pItem);
3044
3045 pItem->SetNotRefundable(this);
3046 pItem->ClearSoulboundTradeable(this);
3047 RemoveTradeableItem(pItem);
3048
3049 ItemTemplate const* proto = pItem->GetTemplate();
3050 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3051 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
3053
3054 ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3055
3056 sScriptMgr->OnItemRemove(this, pItem);
3057
3058 if (bag == INVENTORY_SLOT_BAG_0)
3059 {
3061
3062 // equipment and equipped bags can have applied bonuses
3063 if (slot < INVENTORY_SLOT_BAG_END)
3064 {
3065 ItemTemplate const* pProto = pItem->GetTemplate();
3066
3067 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
3068 if (pProto && pProto->ItemSet)
3069 RemoveItemsSetItem(this, pProto);
3070
3071 _ApplyItemMods(pItem, slot, false);
3072 }
3073
3074 if (slot < EQUIPMENT_SLOT_END)
3075 {
3076 // remove item dependent auras and casts (only weapon and armor slots)
3078
3079 // update expertise and armor penetration - passive auras may need it
3080 switch (slot)
3081 {
3086 default:
3087 break;
3088 }
3089
3090 if (slot == EQUIPMENT_SLOT_MAINHAND)
3092 else if (slot == EQUIPMENT_SLOT_OFFHAND)
3094
3095 // equipment visual show
3096 SetVisibleItemSlot(slot, nullptr);
3097 }
3098
3099 m_items[slot] = nullptr;
3100 }
3101 else if (Bag* pBag = GetBagByPos(bag))
3102 pBag->RemoveItem(slot, update);
3103
3104 // Xinef: item is removed, remove loot from storage if any
3105 if (proto->HasFlag(ITEM_FLAG_HAS_LOOT))
3106 sLootItemStorage->RemoveStoredLoot(pItem->GetGUID());
3107
3108 if (IsInWorld() && update)
3109 {
3110 pItem->RemoveFromWorld();
3111 pItem->DestroyForPlayer(this);
3112 }
3113
3114 //pItem->SetOwnerGUID(0);
3116 pItem->SetSlot(NULL_SLOT);
3117 pItem->SetState(ITEM_REMOVED, this);
3118 }
3119}
@ ITEM_SPELLTRIGGER_ON_NO_DELAY_USE
Definition: ItemTemplate.h:87
@ CHAR_DEL_GIFT
Definition: CharacterDatabase.h:130
bool IsWrapped() const
Definition: Item.h:263
void ItemRemovedQuestCheck(uint32 entry, uint32 count)
Definition: PlayerQuest.cpp:1874
void RemoveItemDependentAurasAndCasts(Item *pItem)
Definition: Player.cpp:12528
void RecalculateRating(CombatRating cr)
Definition: Player.h:1970
void UpdateExpertise(WeaponAttackType attType)
Definition: StatSystem.cpp:877
void SetVisibleItemSlot(uint8 slot, Item *pItem)
Definition: PlayerStorage.cpp:2858

References _ApplyItemMods(), BASE_ATTACK, CHAR_DEL_GIFT, CharacterDatabase, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), DestroyItem(), ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Item::GetCount(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), Item::IsNotEmptyBag(), Item::IsWrapped(), ITEM_FIELD_CONTAINED, ITEM_FLAG_HAS_LOOT, ITEM_REMOVED, ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, ItemRemovedQuestCheck(), ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_BAG_SIZE, MAX_ITEM_PROTO_SPELLS, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), Unit::RemoveAurasDueToSpell(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), PreparedStatementBase::SetData(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetSlot(), Item::SetState(), SetVisibleItemSlot(), sLootItemStorage, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, and UpdateExpertise().

Referenced by AddQuestAndCheckCompletion(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyZoneLimitedItem(), WorldSession::DoLootRelease(), Spell::EffectSummonChangeItem(), bg_commandscript::HandleBagsClearCommand(), debug_commandscript::HandleDebugItemExpireCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), RefundItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), and Item::UpdateDuration().

◆ DestroyItemCount() [1/2]

void Player::DestroyItemCount ( Item item,
uint32 count,
bool  update 
)
3398{
3399 if (!pItem)
3400 return;
3401
3402 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item ({}, Entry: {}) count = {}", pItem->GetGUID().ToString(), pItem->GetEntry(), count);
3403
3404 if (pItem->GetCount() <= count)
3405 {
3406 count -= pItem->GetCount();
3407
3408 DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), update);
3409 }
3410 else
3411 {
3412 ItemRemovedQuestCheck(pItem->GetEntry(), count);
3413 pItem->SetCount(pItem->GetCount() - count);
3414 count = 0;
3415 if (IsInWorld() && update)
3416 pItem->SendUpdateToPlayer(this);
3417 pItem->SetState(ITEM_CHANGED, this);
3418 }
3419}

References DestroyItem(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetSlot(), Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), LOG_DEBUG, Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), and ObjectGuid::ToString().

◆ DestroyItemCount() [2/2]

void Player::DestroyItemCount ( uint32  item,
uint32  count,
bool  update,
bool  unequip_check = false 
)
3122{
3123 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item = {}, count = {}", itemEntry, count);
3124 uint32 remcount = 0;
3125
3126 // in inventory
3128 {
3129 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3130 {
3131 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3132 {
3133 if (item->GetCount() + remcount <= count)
3134 {
3135 // all items in inventory can unequipped
3136 remcount += item->GetCount();
3138
3139 if (remcount >= count)
3140 return;
3141 }
3142 else
3143 {
3144 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3145 item->SetCount(item->GetCount() - count + remcount);
3146 if (IsInWorld() && update)
3147 item->SendUpdateToPlayer(this);
3148 item->SetState(ITEM_CHANGED, this);
3149 return;
3150 }
3151 }
3152 }
3153 }
3154
3156 {
3157 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3158 {
3159 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3160 {
3161 if (item->GetCount() + remcount <= count)
3162 {
3163 // all keys can be unequipped
3164 remcount += item->GetCount();
3166
3167 if (remcount >= count)
3168 return;
3169 }
3170 else
3171 {
3172 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3173 item->SetCount(item->GetCount() - count + remcount);
3174 if (IsInWorld() && update)
3175 item->SendUpdateToPlayer(this);
3176 item->SetState(ITEM_CHANGED, this);
3177 return;
3178 }
3179 }
3180 }
3181 }
3182
3183 // in inventory bags
3185 {
3186 if (Bag* bag = GetBagByPos(i))
3187 {
3188 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3189 {
3190 if (Item* item = bag->GetItemByPos(j))
3191 {
3192 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3193 {
3194 // all items in bags can be unequipped
3195 if (item->GetCount() + remcount <= count)
3196 {
3197 remcount += item->GetCount();
3198 DestroyItem(i, j, update);
3199
3200 if (remcount >= count)
3201 return;
3202 }
3203 else
3204 {
3205 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3206 item->SetCount(item->GetCount() - count + remcount);
3207 if (IsInWorld() && update)
3208 item->SendUpdateToPlayer(this);
3209 item->SetState(ITEM_CHANGED, this);
3210 return;
3211 }
3212 }
3213 }
3214 }
3215 }
3216 }
3217
3218 // in equipment and bag list
3220 {
3221 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3222 {
3223 if (item && item->GetEntry() == itemEntry && !item->IsInTrade())
3224 {
3225 if (item->GetCount() + remcount <= count)
3226 {
3227 if (!unequip_check || CanUnequipItem(INVENTORY_SLOT_BAG_0 << 8 | i, false) == EQUIP_ERR_OK)
3228 {
3229 remcount += item->GetCount();
3231
3232 if (remcount >= count)
3233 return;
3234 }
3235 }
3236 else
3237 {
3238 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3239 item->SetCount(item->GetCount() - count + remcount);
3240 if (IsInWorld() && update)
3241 item->SendUpdateToPlayer(this);
3242 item->SetState(ITEM_CHANGED, this);
3243 return;
3244 }
3245 }
3246 }
3247 }
3248
3249 // in bank
3251 {
3252 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3253 {
3254 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3255 {
3256 if (item->GetCount() + remcount <= count)
3257 {
3258 remcount += item->GetCount();
3260 if (remcount >= count)
3261 return;
3262 }
3263 else
3264 {
3265 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3266 item->SetCount(item->GetCount() - count + remcount);
3267 if (IsInWorld() && update)
3268 item->SendUpdateToPlayer(this);
3269 item->SetState(ITEM_CHANGED, this);
3270 return;
3271 }
3272 }
3273 }
3274 }
3275
3276 // in bank bags
3277 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
3278 {
3279 if (Bag* bag = GetBagByPos(i))
3280 {
3281 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3282 {
3283 if (Item* item = bag->GetItemByPos(j))
3284 {
3285 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3286 {
3287 // all items in bags can be unequipped
3288 if (item->GetCount() + remcount <= count)
3289 {
3290 remcount += item->GetCount();
3291 DestroyItem(i, j, update);
3292
3293 if (remcount >= count)
3294 return;
3295 }
3296 else
3297 {
3298 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3299 item->SetCount(item->GetCount() - count + remcount);
3300 if (IsInWorld() && update)
3301 item->SendUpdateToPlayer(this);
3302 item->SetState(ITEM_CHANGED, this);
3303 return;
3304 }
3305 }
3306 }
3307 }
3308 }
3309 }
3310}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanUnequipItem(), CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by _StoreOrEquipNewItem(), AbandonQuest(), WorldSession::DoLootRelease(), Spell::EffectCreateItem2(), Spell::EffectEnchantItemPerm(), Spell::EffectFeedPet(), Spell::EffectScriptEffect(), FailQuest(), go_ahune_ice_stone::GossipSelect(), misc_commandscript::HandleAddItemCommand(), spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), WorldSession::HandleDestroyItemOpcode(), spell_item_massive_seaforium_charge::HandleItemRemove(), WorldSession::HandleWrapItemOpcode(), npc_brewfest_keg_reciver::MoveInLineOfSight(), at_hor_battered_hilt_throw::OnTrigger(), npc_oculus_drakegiver::RemoveEssence(), spell_najentus_remove_spines::RemoveSpines(), RewardQuest(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Spell::TakeAmmo(), Spell::TakeCastItem(), TakeQuestSourceItem(), and Spell::TakeReagents().

◆ DestroyZoneLimitedItem()

void Player::DestroyZoneLimitedItem ( bool  update,
uint32  new_zone 
)
3313{
3314 LOG_DEBUG("entities.player.items", "STORAGE: DestroyZoneLimitedItem in map {} and area {}", GetMapId(), new_zone);
3315
3316 // in inventory
3318 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3319 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3321
3323 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3324 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3326
3327 // in inventory bags
3329 if (Bag* pBag = GetBagByPos(i))
3330 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3331 if (Item* pItem = pBag->GetItemByPos(j))
3332 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3333 DestroyItem(i, j, update);
3334
3335 // in equipment and bag list
3337 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3338 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3340}

References CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), WorldLocation::GetMapId(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by UpdateZone().

◆ DoRandomRoll()

uint32 Player::DoRandomRoll ( uint32  minimum,
uint32  maximum 
)
16119{
16120 ASSERT(minimum <= maximum);
16121
16122 uint32 roll = urand(minimum, maximum);
16123
16125 randomRoll.Min = minimum;
16126 randomRoll.Max = maximum;
16127 randomRoll.Result = roll;
16128 randomRoll.Roller = GetGUID();
16129 if (Group* group = GetGroup())
16130 group->BroadcastPacket(randomRoll.Write(), false);
16131 else
16132 SendDirectMessage(randomRoll.Write());
16133
16134 return roll;
16135}
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
Definition: MiscPackets.h:108
uint32 Max
Definition: MiscPackets.h:115
uint32 Result
Definition: MiscPackets.h:116
WorldPacket const * Write() override
Definition: MiscPackets.cpp:76
uint32 Min
Definition: MiscPackets.h:114
ObjectGuid Roller
Definition: MiscPackets.h:117

References ASSERT, GetGroup(), Object::GetGUID(), WorldPackets::Misc::RandomRoll::Max, WorldPackets::Misc::RandomRoll::Min, WorldPackets::Misc::RandomRoll::Result, WorldPackets::Misc::RandomRoll::Roller, SendDirectMessage(), urand(), and WorldPackets::Misc::RandomRoll::Write().

Referenced by WorldSession::HandleRandomRollOpcode(), and spell_item_worn_troll_dice::HandleScript().

◆ DropModCharge()

void Player::DropModCharge ( SpellModifier mod,
Spell spell 
)
10015{
10016 if (spell && mod->ownerAura && mod->charges > 0)
10017 {
10018 if (--mod->charges == 0)
10019 mod->charges = -1;
10020
10021 spell->m_appliedMods.insert(mod->ownerAura);
10022 }
10023}
int16 charges
Definition: Player.h:185
UsedSpellMods m_appliedMods
Definition: Spell.h:548

References SpellModifier::charges, Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ DuelComplete()

void Player::DuelComplete ( DuelCompleteType  type)
6432{
6433 // duel not requested
6434 if (!duel)
6435 return;
6436
6437 // Check if DuelComplete() has been called already up in the stack and in that case don't do anything else here
6438 if (duel->State == DUEL_STATE_COMPLETED)
6439 return;
6440
6441 Player* opponent = duel->Opponent;
6442 duel->State = DUEL_STATE_COMPLETED;
6443 opponent->duel->State = DUEL_STATE_COMPLETED;
6444
6445 LOG_DEBUG("entities.unit", "Player::DuelComplete: Player '{}' ({}), Opponent: '{}' ({})", GetName(), GetGUID().ToString(), opponent->GetName(), opponent->GetGUID().ToString());
6446
6448 data << uint8((type != DUEL_INTERRUPTED) ? 1 : 0);
6449 SendDirectMessage(&data);
6450 if (opponent->GetSession())
6451 {
6452 opponent->SendDirectMessage(&data);
6453 }
6454
6455 if (type != DUEL_INTERRUPTED)
6456 {
6457 data.Initialize(SMSG_DUEL_WINNER, (1 + 20)); // we guess size
6458 data << uint8(type == DUEL_WON ? 0 : 1); // 0 = just won; 1 = fled
6459 data << opponent->GetName();
6460 data << GetName();
6461 SendMessageToSet(&data, true);
6462 }
6463
6464 sScriptMgr->OnPlayerDuelEnd(opponent, this, type);
6465
6466 switch (type)
6467 {
6468 case DUEL_FLED:
6469 // if initiator and opponent are on the same team
6470 // or initiator and opponent are not PvP enabled, forcibly stop attacking
6471 if (GetTeamId() == opponent->GetTeamId())
6472 {
6473 AttackStop();
6474 opponent->AttackStop();
6475 }
6476 else
6477 {
6478 if (!IsPvP())
6479 {
6480 AttackStop();
6481 }
6482 if (!opponent->IsPvP())
6483 {
6484 opponent->AttackStop();
6485 }
6486 }
6487 break;
6488 case DUEL_WON:
6491
6492 // Credit for quest Death's Challenge
6494 {
6495 opponent->CastSpell(opponent, 52994, true);
6496 }
6497
6498 // Honor points after duel (the winner) - ImpConfig
6499 if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL))
6500 {
6501 opponent->RewardHonor(nullptr, 1, amount);
6502 }
6503
6504 break;
6505 default:
6506 break;
6507 }
6508
6509 // Victory emote spell
6510 if (type != DUEL_INTERRUPTED)
6511 {
6512 opponent->CastSpell(opponent, 52852, true);
6513 }
6514
6515 // Remove Duel Flag object
6517 if (obj)
6518 {
6519 duel->Initiator->RemoveGameObject(obj, true);
6520 }
6521
6522 /* remove auras */
6523 AuraApplicationMap& itsAuras = opponent->GetAppliedAuras();
6524 for (AuraApplicationMap::iterator i = itsAuras.begin(); i != itsAuras.end();)
6525 {
6526 Aura const* aura = i->second->GetBase();
6527 if (!i->second->IsPositive() && aura->GetCasterGUID() == GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6528 {
6529 opponent->RemoveAura(i);
6530 }
6531 else
6532 {
6533 ++i;
6534 }
6535 }
6536
6538 for (AuraApplicationMap::iterator i = myAuras.begin(); i != myAuras.end();)
6539 {
6540 Aura const* aura = i->second->GetBase();
6541 if (!i->second->IsPositive() && aura->GetCasterGUID() == opponent->GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6542 RemoveAura(i);
6543 else
6544 ++i;
6545 }
6546
6547 // cleanup combo points
6548 if (GetComboTarget() == duel->Opponent)
6549 {
6551 }
6552 else if (GetComboTargetGUID() == duel->Opponent->GetPetGUID())
6553 {
6555 }
6556
6557 if (duel->Opponent->GetComboTarget() == this)
6558 {
6559 duel->Opponent->ClearComboPoints();
6560 }
6561 else if (duel->Opponent->GetComboTargetGUID() == GetPetGUID())
6562 {
6563 duel->Opponent->ClearComboPoints();
6564 }
6565
6566 //cleanups
6570 opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 0);
6571
6572 opponent->duel.reset(nullptr);
6573 duel.reset(nullptr);
6574}
@ PLAYER_DUEL_TEAM
Definition: UpdateFields.h:184
@ CLASS_CONTEXT_QUEST
Definition: UnitDefines.h:229
@ DUEL_STATE_COMPLETED
Definition: Player.h:379
@ CONFIG_HONOR_AFTER_DUEL
Definition: IWorld.h:338
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL
Definition: DBCEnums.h:186
@ ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL
Definition: DBCEnums.h:187
@ DUEL_WON
Definition: SharedDefines.h:3629
@ SMSG_DUEL_WINNER
Definition: Opcodes.h:393
@ SMSG_DUEL_COMPLETE
Definition: Opcodes.h:392
bool RewardHonor(Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
Definition: Player.cpp:6085
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.cpp:5677
bool IsPvP()
Definition: Player.cpp:16170
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:629
void ClearComboPoints()
Definition: Unit.cpp:16897
Unit * GetComboTarget() const
Definition: Unit.h:953
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition: Unit.cpp:10447
ObjectGuid const GetComboTargetGUID() const
Definition: Unit.h:954
ObjectGuid GetPetGUID() const
Definition: Unit.h:678
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:105
time_t GetApplyTime() const
Definition: SpellAuras.h:128

References ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, Unit::AttackStop(), Unit::CastSpell(), CLASS_CONTEXT_QUEST, CLASS_DEATH_KNIGHT, Unit::ClearComboPoints(), CONFIG_HONOR_AFTER_DUEL, duel, DUEL_FLED, DUEL_INTERRUPTED, DUEL_STATE_COMPLETED, DUEL_WON, ObjectGuid::Empty, Unit::GetAppliedAuras(), Aura::GetApplyTime(), Aura::GetCasterGUID(), Unit::GetComboTarget(), Unit::GetComboTargetGUID(), Map::GetGameObject(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldObject::GetName(), Unit::GetPetGUID(), GetQuestStatus(), GetSession(), GetTeamId(), WorldPacket::Initialize(), IsClass(), IsPvP(), LOG_DEBUG, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, QUEST_STATUS_INCOMPLETE, Unit::RemoveAura(), RewardHonor(), SendDirectMessage(), SendMessageToSet(), Object::SetGuidValue(), Unit::SetUInt32Value(), SMSG_DUEL_COMPLETE, SMSG_DUEL_WINNER, sScriptMgr, sWorld, ObjectGuid::ToString(), Position::ToString(), and UpdateAchievementCriteria().

Referenced by Unit::_ExitVehicle(), CheckDuelDistance(), CleanupsBeforeDelete(), Unit::DealDamage(), WorldSession::HandleDuelCancelledOpcode(), and TeleportTo().

◆ DurabilityLoss()

void Player::DurabilityLoss ( Item item,
double  percent 
)
4752{
4753 if (!item || percent == 0.0)
4754 return;
4755
4756 uint32 pMaxDurability = item ->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4757
4758 if (!pMaxDurability)
4759 return;
4760
4761 uint32 pDurabilityLoss = uint32(pMaxDurability * percent);
4762
4763 if (pDurabilityLoss < 1)
4764 pDurabilityLoss = 1;
4765
4766 DurabilityPointsLoss(item, pDurabilityLoss);
4767}
@ ITEM_FIELD_MAXDURABILITY
Definition: UpdateFields.h:70
void DurabilityPointsLoss(Item *item, int32 points)
Definition: Player.cpp:4795

References DurabilityPointsLoss(), Object::GetUInt32Value(), and ITEM_FIELD_MAXDURABILITY.

Referenced by DurabilityLossAll(), Spell::EffectDurabilityDamagePCT(), and Spell::EffectSummonChangeItem().

◆ DurabilityLossAll()

void Player::DurabilityLossAll ( double  percent,
bool  inventory 
)
4726{
4728 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4729 DurabilityLoss(pItem, percent);
4730
4731 if (inventory)
4732 {
4733 // bags not have durability
4734 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4735
4737 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4738 DurabilityLoss(pItem, percent);
4739
4740 // keys not have durability
4741 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4742
4744 if (Bag* pBag = GetBagByPos(i))
4745 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4746 if (Item* pItem = GetItemByPos(i, j))
4747 DurabilityLoss(pItem, percent);
4748 }
4749}
void DurabilityLoss(Item *item, double percent)
Definition: Player.cpp:4751

References DurabilityLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamagePCT(), EnvironmentalDamage(), and WorldSession::SendSpiritResurrect().

◆ DurabilityPointLossForEquipSlot()

void Player::DurabilityPointLossForEquipSlot ( EquipmentSlots  slot)
4826{
4827 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
4828 DurabilityPointsLoss(pItem, 1);
4829}

References DurabilityPointsLoss(), GetItemByPos(), and INVENTORY_SLOT_BAG_0.

Referenced by Unit::DealDamage(), and Spell::TakeAmmo().

◆ DurabilityPointsLoss()

void Player::DurabilityPointsLoss ( Item item,
int32  points 
)
4796{
4798 return;
4799
4800 int32 pMaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4801 int32 pOldDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4802 int32 pNewDurability = pOldDurability - points;
4803
4804 if (pNewDurability < 0)
4805 pNewDurability = 0;
4806 else if (pNewDurability > pMaxDurability)
4807 pNewDurability = pMaxDurability;
4808
4809 if (pOldDurability != pNewDurability)
4810 {
4811 // modify item stats _before_ Durability set to 0 to pass _ApplyItemMods internal check
4812 if (pNewDurability == 0 && pOldDurability > 0 && item->IsEquipped())
4813 _ApplyItemMods(item, item->GetSlot(), false);
4814
4815 item->SetUInt32Value(ITEM_FIELD_DURABILITY, pNewDurability);
4816
4817 // modify item stats _after_ restore durability to pass _ApplyItemMods internal check
4818 if (pNewDurability > 0 && pOldDurability == 0 && item->IsEquipped())
4819 _ApplyItemMods(item, item->GetSlot(), true);
4820
4821 item->SetState(ITEM_CHANGED, this);
4822 }
4823}
@ ITEM_FIELD_DURABILITY
Definition: UpdateFields.h:69
bool HasPreventDurabilityLossAura() const
Definition: Unit.h:1711

References _ApplyItemMods(), Item::GetSlot(), Object::GetUInt32Value(), Unit::HasPreventDurabilityLossAura(), Item::IsEquipped(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, Item::SetState(), and Object::SetUInt32Value().

Referenced by DurabilityLoss(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), and Spell::EffectDurabilityDamage().

◆ DurabilityPointsLossAll()

void Player::DurabilityPointsLossAll ( int32  points,
bool  inventory 
)
4770{
4772 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4773 DurabilityPointsLoss(pItem, points);
4774
4775 if (inventory)
4776 {
4777 // bags not have durability
4778 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4779
4781 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4782 DurabilityPointsLoss(pItem, points);
4783
4784 // keys not have durability
4785 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4786
4788 if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4789 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4790 if (Item* pItem = GetItemByPos(i, j))
4791 DurabilityPointsLoss(pItem, points);
4792 }
4793}

References DurabilityPointsLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamage().

◆ DurabilityRepair()

uint32 Player::DurabilityRepair ( uint16  pos,
bool  cost,
float  discountMod,
bool  guildBank 
)
4848{
4849 Item* item = GetItemByPos(pos);
4850
4851 uint32 TotalCost = 0;
4852 if (!item)
4853 return TotalCost;
4854
4855 uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4856 if (!maxDurability)
4857 return TotalCost;
4858
4859 uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4860
4861 if (cost)
4862 {
4863 uint32 LostDurability = maxDurability - curDurability;
4864 if (LostDurability > 0)
4865 {
4866 ItemTemplate const* ditemProto = item->GetTemplate();
4867
4868 DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel);
4869 if (!dcost)
4870 {
4871 LOG_ERROR("entities.player", "RepairDurability: Wrong item lvl {}", ditemProto->ItemLevel);
4872 return TotalCost;
4873 }
4874
4875 uint32 dQualitymodEntryId = (ditemProto->Quality + 1) * 2;
4876 DurabilityQualityEntry const* dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId);
4877 if (!dQualitymodEntry)
4878 {
4879 LOG_ERROR("entities.player", "RepairDurability: Wrong dQualityModEntry {}", dQualitymodEntryId);
4880 return TotalCost;
4881 }
4882
4883 uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class, ditemProto->SubClass)];
4884 uint32 costs = uint32(LostDurability * dmultiplier * double(dQualitymodEntry->quality_mod));
4885
4886 costs = uint32(costs * discountMod * sWorld->getRate(RATE_REPAIRCOST));
4887
4888 if (costs == 0) //fix for ITEM_QUALITY_ARTIFACT
4889 costs = 1;
4890
4891 if (guildBank)
4892 {
4893 if (GetGuildId() == 0)
4894 {
4895 // LOG_DEBUG("entities.player", "You are not member of a guild");
4896 return TotalCost;
4897 }
4898
4899 Guild* guild = sGuildMgr->GetGuildById(GetGuildId());
4900 if (!guild)
4901 return TotalCost;
4902
4903 if (!guild->HandleMemberWithdrawMoney(GetSession(), costs, true))
4904 return TotalCost;
4905
4906 TotalCost = costs;
4907 }
4908 else if (!HasEnoughMoney(costs))
4909 {
4910 // LOG_DEBUG("entities.player", "You do not have enough money");
4911 return TotalCost;
4912 }
4913 else
4914 ModifyMoney(-int32(costs));
4915 }
4916 }
4917
4918 item->SetUInt32Value(ITEM_FIELD_DURABILITY, maxDurability);
4919 item->SetState(ITEM_CHANGED, this);
4920
4921 // reapply mods for total broken and repaired item if equipped
4922 if (IsEquipmentPos(pos) && !curDurability)
4923 _ApplyItemMods(item, pos & 255, true);
4924 return TotalCost;
4925}
DBCStorage< DurabilityQualityEntry > sDurabilityQualityStore(DurabilityQualityfmt)
DBCStorage< DurabilityCostsEntry > sDurabilityCostsStore(DurabilityCostsfmt)
uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
Definition: ItemTemplate.h:557
@ RATE_REPAIRCOST
Definition: IWorld.h:486
uint32 ItemLevel
Definition: ItemTemplate.h:635
bool HandleMemberWithdrawMoney(WorldSession *session, uint32 amount, bool repair=false)
Definition: Guild.cpp:1694
Definition: DBCStructure.h:878
uint32 multiplier[29]
Definition: DBCStructure.h:880
Definition: DBCStructure.h:884
float quality_mod
Definition: DBCStructure.h:886

References _ApplyItemMods(), ItemTemplate::Class, GetGuildId(), GetItemByPos(), GetSession(), Item::GetTemplate(), Object::GetUInt32Value(), Guild::HandleMemberWithdrawMoney(), HasEnoughMoney(), IsEquipmentPos(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, ItemTemplate::ItemLevel, ItemSubClassToDurabilityMultiplierId(), LOG_ERROR, ModifyMoney(), DurabilityCostsEntry::multiplier, ItemTemplate::Quality, DurabilityQualityEntry::quality_mod, RATE_REPAIRCOST, sDurabilityCostsStore, sDurabilityQualityStore, Item::SetState(), Object::SetUInt32Value(), sGuildMgr, ItemTemplate::SubClass, and sWorld.

Referenced by DurabilityRepairAll(), and WorldSession::HandleRepairItemOpcode().

◆ DurabilityRepairAll()

uint32 Player::DurabilityRepairAll ( bool  cost,
float  discountMod,
bool  guildBank 
)
4832{
4833 uint32 TotalCost = 0;
4834 // equipped, backpack, bags itself
4836 TotalCost += DurabilityRepair(((INVENTORY_SLOT_BAG_0 << 8) | i), cost, discountMod, guildBank);
4837
4838 // bank, buyback and keys not repaired
4839
4840 // items in inventory bags
4842 for (uint8 i = 0; i < MAX_BAG_SIZE; i++)
4843 TotalCost += DurabilityRepair(((j << 8) | i), cost, discountMod, guildBank);
4844 return TotalCost;
4845}
uint32 DurabilityRepair(uint16 pos, bool cost, float discountMod, bool guildBank)
Definition: Player.cpp:4847

References DurabilityRepair(), EQUIPMENT_SLOT_START, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and MAX_BAG_SIZE.

Referenced by WorldSession::HandleRepairItemOpcode().

◆ EnchantmentFitsRequirements()

bool Player::EnchantmentFitsRequirements ( uint32  enchantmentcondition,
int8  slot 
)
11071{
11072 if (!enchantmentcondition)
11073 return true;
11074
11075 SpellItemEnchantmentConditionEntry const* Condition = sSpellItemEnchantmentConditionStore.LookupEntry(enchantmentcondition);
11076
11077 if (!Condition)
11078 return true;
11079
11080 uint8 curcount[4] = {0, 0, 0, 0};
11081
11082 //counting current equipped gem colors
11084 {
11085 if (i == slot)
11086 continue;
11088 if (pItem2 && !pItem2->IsBroken() && pItem2->HasSocket())
11089 {
11090 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot <= PRISMATIC_ENCHANTMENT_SLOT; ++enchant_slot)
11091 {
11092 if (enchant_slot == BONUS_ENCHANTMENT_SLOT)
11093 continue;
11094
11095 uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11096 if (!enchant_id)
11097 continue;
11098
11099 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11100 if (!enchantEntry)
11101 continue;
11102
11103 uint32 gemid = enchantEntry->GemID;
11104 if (!gemid)
11105 continue;
11106
11107 ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid);
11108 if (!gemProto)
11109 continue;
11110
11111 GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GemProperties);
11112 if (!gemProperty)
11113 continue;
11114
11115 uint8 GemColor = gemProperty->color;
11116
11117 for (uint8 b = 0, tmpcolormask = 1; b < 4; b++, tmpcolormask <<= 1)
11118 {
11119 if (tmpcolormask & GemColor)
11120 ++curcount[b];
11121 }
11122 }
11123 }
11124 }
11125
11126 bool activate = true;
11127
11128 for (uint8 i = 0; i < 5; i++)
11129 {
11130 if (!Condition->Color[i])
11131 continue;
11132
11133 uint32 _cur_gem = curcount[Condition->Color[i] - 1];
11134
11135 // if have <CompareColor> use them as count, else use <value> from Condition
11136 uint32 _cmp_gem = Condition->CompareColor[i] ? curcount[Condition->CompareColor[i] - 1] : Condition->Value[i];
11137
11138 switch (Condition->Comparator[i])
11139 {
11140 case 2: // requires less <color> than (<value> || <comparecolor>) gems
11141 activate &= (_cur_gem < _cmp_gem);
11142 break;
11143 case 3: // requires more <color> than (<value> || <comparecolor>) gems
11144 activate &= (_cur_gem > _cmp_gem);
11145 break;
11146 case 5: // requires at least <color> than (<value> || <comparecolor>) gems
11147 activate &= (_cur_gem >= _cmp_gem);
11148 break;
11149 }
11150 }
11151
11152 LOG_DEBUG("entities.player.items", "Checking Condition {}, there are {} Meta Gems, {} Red Gems, {} Yellow Gems and {} Blue Gems, Activate:{}", enchantmentcondition, curcount[0], curcount[1], curcount[2], curcount[3], activate ? "yes" : "no");
11153
11154 return activate;
11155}
DBCStorage< SpellItemEnchantmentConditionEntry > sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt)
DBCStorage< GemPropertiesEntry > sGemPropertiesStore(GemPropertiesEntryfmt)
@ BONUS_ENCHANTMENT_SLOT
Definition: Item.h:174
Definition: ConditionMgr.h:195
uint32 GemProperties
Definition: ItemTemplate.h:683
Definition: DBCStructure.h:1015
uint32 color
Definition: DBCStructure.h:1018
Definition: DBCStructure.h:1861

References BONUS_ENCHANTMENT_SLOT, GemPropertiesEntry::color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, SpellItemEnchantmentEntry::GemID, ItemTemplate::GemProperties, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), LOG_DEBUG, PRISMATIC_ENCHANTMENT_SLOT, sGemPropertiesStore, sObjectMgr, SOCK_ENCHANTMENT_SLOT, sSpellItemEnchantmentConditionStore, and sSpellItemEnchantmentStore.

Referenced by ApplyEnchantment(), and CorrectMetaGemEnchants().

◆ EnvironmentalDamage()

uint32 Player::EnvironmentalDamage ( EnviromentalDamage  type,
uint32  damage 
)
761{
763 return 0;
764
765 // Absorb, resist some environmental damage type
766 uint32 absorb = 0;
767 uint32 resist = 0;
768
769 switch (type)
770 {
771 case DAMAGE_LAVA:
772 case DAMAGE_SLIME:
773 {
774 DamageInfo dmgInfo(this, this, damage, nullptr, type == DAMAGE_LAVA ? SPELL_SCHOOL_MASK_FIRE : SPELL_SCHOOL_MASK_NATURE, DIRECT_DAMAGE);
775 Unit::CalcAbsorbResist(dmgInfo);
776 absorb = dmgInfo.GetAbsorb();
777 resist = dmgInfo.GetResist();
778 damage = dmgInfo.GetDamage();
779 }
780 default:
781 break;
782 }
783
784 Unit::DealDamageMods(this, damage, &absorb);
785
787 packet.Victim = GetGUID();
788 packet.Type = type != DAMAGE_FALL_TO_VOID ? type : DAMAGE_FALL;
789 packet.Amount = damage;
790 packet.Absorbed = absorb;
791 packet.Resisted = resist;
792 SendMessageToSet(packet.Write(), true);
793
794 uint32 final_damage = Unit::DealDamage(this, this, damage, nullptr, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
795
796 if (!IsAlive())
797 {
798 if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage
799 {
800 LOG_DEBUG("entities.player", "Player::EnvironmentalDamage: Player '{}' ({}) fall to death, losing {} durability",
803 // durability lost message
805 }
806
808 }
809
810 return final_damage;
811}
@ SELF_DAMAGE
Definition: Unit.h:254
@ DIRECT_DAMAGE
Definition: Unit.h:249
@ DAMAGE_SLIME
Definition: Player.h:844
@ DAMAGE_FALL
Definition: Player.h:842
@ DAMAGE_LAVA
Definition: Player.h:843
@ DAMAGE_FALL_TO_VOID
Definition: Player.h:846
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: IWorld.h:521
@ ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM
Definition: DBCEnums.h:140
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:300
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:299
void DurabilityLossAll(double percent, bool inventory)
Definition: Player.cpp:4725
void SendDurabilityLoss()
Definition: Player.cpp:4720
bool IsImmuneToEnvironmentalDamage()
Definition: Player.cpp:754
Definition: Unit.h:331
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2159
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:801
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition: Unit.cpp:811
Definition: CombatLogPackets.h:29
ObjectGuid Victim
Definition: CombatLogPackets.h:35
uint32 Amount
Definition: CombatLogPackets.h:37
uint32 Absorbed
Definition: CombatLogPackets.h:39
EnviromentalDamage Type
Definition: CombatLogPackets.h:36
uint32 Resisted
Definition: CombatLogPackets.h:38
WorldPacket const * Write() override
Definition: CombatLogPackets.cpp:20

References WorldPackets::CombatLog::EnvironmentalDamageLog::Absorbed, ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, WorldPackets::CombatLog::EnvironmentalDamageLog::Amount, Unit::CalcAbsorbResist(), DAMAGE_FALL, DAMAGE_FALL_TO_VOID, DAMAGE_LAVA, DAMAGE_SLIME, Unit::DealDamage(), Unit::DealDamageMods(), DIRECT_DAMAGE, DurabilityLossAll(), DamageInfo::GetAbsorb(), DamageInfo::GetDamage(), Object::GetGUID(), WorldObject::GetName(), DamageInfo::GetResist(), Unit::IsAlive(), IsImmuneToEnvironmentalDamage(), LOG_DEBUG, RATE_DURABILITY_LOSS_ON_DEATH, WorldPackets::CombatLog::EnvironmentalDamageLog::Resisted, SELF_DAMAGE, SendDurabilityLoss(), SendMessageToSet(), SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_NATURE, SPELL_SCHOOL_MASK_NORMAL, sWorld, Position::ToString(), WorldPackets::CombatLog::EnvironmentalDamageLog::Type, UpdateAchievementCriteria(), WorldPackets::CombatLog::EnvironmentalDamageLog::Victim, and WorldPackets::CombatLog::EnvironmentalDamageLog::Write().

Referenced by Spell::EffectEnvironmentalDMG(), HandleDrowning(), HandleFall(), and WorldSession::HandleMovementOpcodes().

◆ EquipItem()

Item * Player::EquipItem ( uint16  pos,
Item pItem,
bool  update 
)
2728{
2730 AddItemDurations(pItem);
2731
2732 uint8 bag = pos >> 8;
2733 uint8 slot = pos & 255;
2734
2735 Item* pItem2 = GetItemByPos(bag, slot);
2736
2737 if (!pItem2)
2738 {
2739 VisualizeItem(slot, pItem);
2740
2741 if (IsAlive())
2742 {
2743 ItemTemplate const* pProto = pItem->GetTemplate();
2744
2745 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2746 if (pProto && pProto->ItemSet)
2747 AddItemsSetItem(this, pItem);
2748
2749 _ApplyItemMods(pItem, slot, true);
2750
2751 if (pProto && IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer == 0)
2752 {
2753 uint32 cooldownSpell = IsClass(CLASS_ROGUE, CLASS_CONTEXT_WEAPON_SWAP) ? 6123 : 6119;
2754 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell);
2755
2756 if (!spellProto)
2757 LOG_ERROR("entities.player", "Weapon switch cooldown spell {} couldn't be found in Spell.dbc", cooldownSpell);
2758 else
2759 {
2761
2763
2764 WorldPacket data;
2766 GetSession()->SendPacket(&data);
2767 }
2768 }
2769 }
2770
2771 if (IsInWorld() && update)
2772 {
2773 pItem->AddToWorld();
2774 pItem->SendUpdateToPlayer(this);
2775 }
2776
2777 ApplyEquipCooldown(pItem);
2778
2779 // update expertise and armor penetration - passive auras may need it
2780
2781 if (slot == EQUIPMENT_SLOT_MAINHAND)
2783
2784 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2786
2787 switch (slot)
2788 {
2793 default:
2794 break;
2795 }
2796 }
2797 else
2798 {
2799 pItem2->SetCount(pItem2->GetCount() + pItem->GetCount());
2800 if (IsInWorld() && update)
2801 pItem2->SendUpdateToPlayer(this);
2802
2803 // delete item (it not in any slot currently)
2804 //pItem->DeleteFromDB();
2805 if (IsInWorld() && update)
2806 {
2807 pItem->RemoveFromWorld();
2808 pItem->DestroyForPlayer(this);
2809 }
2810
2812 RemoveItemDurations(pItem);
2813
2814 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2815 pItem->SetNotRefundable(this);
2816 pItem->ClearSoulboundTradeable(this);
2817 RemoveTradeableItem(pItem);
2818 pItem->SetState(ITEM_REMOVED, this);
2819 pItem2->SetState(ITEM_CHANGED, this);
2820
2821 ApplyEquipCooldown(pItem2);
2822 sScriptMgr->OnPlayerEquip(this, pItem2, bag, slot, update);
2823 return pItem2;
2824 }
2825
2826 // only for full equip instead adding to stack
2829
2830 sScriptMgr->OnPlayerEquip(this, pItem, bag, slot, update);
2832 return pItem;
2833}
@ SPELL_COOLDOWN_FLAG_INCLUDE_GCD
Starts GCD in addition to normal cooldown specified in the packet.
Definition: Unit.h:607
@ CLASS_CONTEXT_WEAPON_SWAP
Definition: UnitDefines.h:241
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM
Definition: DBCEnums.h:171
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM
Definition: DBCEnums.h:163
void UpdateForQuestWorldObjects()
Definition: PlayerUpdates.cpp:1792
void ApplyEquipCooldown(Item *pItem)
Definition: Player.cpp:11719
void VisualizeItem(uint8 slot, Item *pItem)
Definition: PlayerStorage.cpp:2875
void AddGlobalCooldown(SpellInfo const *spellInfo, uint32 gcd)
Definition: CharmInfo.cpp:419
uint32 StartRecoveryTime
Definition: SpellInfo.h:351

References _ApplyItemMods(), ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), GlobalCooldownMgr::AddGlobalCooldown(), AddItemDurations(), AddItemsSetItem(), Object::AddToWorld(), ApplyEquipCooldown(), BASE_ATTACK, Unit::BuildCooldownPacket(), ItemTemplate::Class, CLASS_CONTEXT_WEAPON_SWAP, CLASS_ROGUE, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, Item::GetCount(), Object::GetEntry(), GetGlobalCooldownMgr(), Object::GetGUID(), GetItemByPos(), GetSession(), Item::GetTemplate(), ItemTemplate::InventoryType, INVTYPE_RELIC, Unit::IsAlive(), IsClass(), Unit::IsInCombat(), Object::IsInWorld(), ITEM_CHANGED, ITEM_CLASS_WEAPON, ITEM_REMOVED, ItemTemplate::ItemSet, LOG_ERROR, m_weaponChangeTimer, OFF_ATTACK, RecalculateRating(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), WorldSession::SendPacket(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetState(), SPELL_COOLDOWN_FLAG_INCLUDE_GCD, sScriptMgr, sSpellMgr, SpellInfo::StartRecoveryTime, UpdateAchievementCriteria(), UpdateExpertise(), UpdateForQuestWorldObjects(), and VisualizeItem().

Referenced by Create(), Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoEquipItemOpcode(), SplitItem(), and SwapItem().

◆ EquipNewItem()

Item * Player::EquipNewItem ( uint16  pos,
uint32  item,
bool  update 
)
2708{
2709 Item* _item = Item::CreateItem(item, 1, this);
2710 if (!_item)
2711 return nullptr;
2712
2713 if (!IsEquipmentPos(pos) || sScriptMgr->OnPlayerCanSaveEquipNewItem(this, _item, pos, update))
2714 {
2715 // pussywizard: obtaining blue or better items saves to db
2716 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2717 if (pProto->Quality >= ITEM_QUALITY_RARE)
2719
2720 ItemAddedQuestCheck(item, 1);
2722 }
2723
2724 return EquipItem(pos, _item, update);
2725}
@ ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM
Definition: DBCEnums.h:199
@ ITEM_QUALITY_RARE
Definition: SharedDefines.h:332
void ItemAddedQuestCheck(uint32 entry, uint32 count)
Definition: PlayerQuest.cpp:1835

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), Item::CreateItem(), EquipItem(), IsEquipmentPos(), ITEM_QUALITY_RARE, ItemAddedQuestCheck(), sObjectMgr, sScriptMgr, and UpdateAchievementCriteria().

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ ExecuteOrCancelSpellCastRequest()

void Player::ExecuteOrCancelSpellCastRequest ( PendingSpellCastRequest castRequest,
bool  isCancel = false 
)
2363{
2364 if (isCancel)
2365 request->cancelInProgress = true;
2366
2367 if (WorldSession* session = GetSession())
2368 {
2369 if (request->isItem)
2370 session->HandleUseItemOpcode(request->requestPacket);
2371 else
2372 session->HandleCastSpellOpcode(request->requestPacket);
2373 }
2374}

References PendingSpellCastRequest::cancelInProgress, GetSession(), PendingSpellCastRequest::isItem, and PendingSpellCastRequest::requestPacket.

Referenced by ProcessSpellQueue().

◆ FailQuest()

void Player::FailQuest ( uint32  quest_id)
887{
888 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
889 {
890 QuestStatus qStatus = GetQuestStatus(questId);
891 // xinef: if quest is marked as failed, dont do it again
892 if ((qStatus != QUEST_STATUS_INCOMPLETE) && (!quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE)))
893 return;
894
896
897 uint16 log_slot = FindQuestSlot(questId);
898
899 if (log_slot < MAX_QUEST_LOG_SIZE)
900 {
901 SetQuestSlotTimer(log_slot, 1);
903 }
904
905 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
906 {
907 QuestStatusData& q_status = m_QuestStatus[questId];
908
909 RemoveTimedQuest(questId);
910 q_status.Timer = 0;
911
912 SendQuestTimerFailed(questId);
913 }
914 else
915 SendQuestFailed(questId);
916
917 // Destroy quest items on quest failure.
918 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
919 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
920 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
921 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
922
923 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
924 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
925 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
926 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
927 }
928}
@ QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE
Definition: QuestDef.h:167
void SendQuestTimerFailed(uint32 quest_id)
Definition: PlayerQuest.cpp:2394
void SendQuestFailed(uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
Definition: PlayerQuest.cpp:2382
void SetQuestSlotTimer(uint16 slot, uint32 timer)
Definition: Player.h:1516
void RemoveTimedQuest(uint32 quest_id)
Definition: Player.h:1567

References BIND_QUEST_ITEM, DestroyItemCount(), FindQuestSlot(), GetQuestStatus(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_FAIL, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, RemoveTimedQuest(), SendQuestFailed(), SendQuestTimerFailed(), SetQuestSlotState(), SetQuestSlotTimer(), SetQuestStatus(), sObjectMgr, and QuestStatusData::Timer.

Referenced by npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), SmartAI::EndPath(), dragonmaw_race_npc::FailQuest(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_captain_saeed::npc_captain_saeedAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_doctor::npc_doctorAI::PatientDied(), Map::ScriptsProcess(), Update(), and npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI().

◆ FindEquipSlot()

uint8 Player::FindEquipSlot ( ItemTemplate const *  proto,
uint32  slot,
bool  swap 
) const
126{
127 uint8 slots[4];
128 slots[0] = NULL_SLOT;
129 slots[1] = NULL_SLOT;
130 slots[2] = NULL_SLOT;
131 slots[3] = NULL_SLOT;
132 switch (proto->InventoryType)
133 {
134 case INVTYPE_HEAD:
135 slots[0] = EQUIPMENT_SLOT_HEAD;
136 break;
137 case INVTYPE_NECK:
138 slots[0] = EQUIPMENT_SLOT_NECK;
139 break;
141 slots[0] = EQUIPMENT_SLOT_SHOULDERS;
142 break;
143 case INVTYPE_BODY:
144 slots[0] = EQUIPMENT_SLOT_BODY;
145 break;
146 case INVTYPE_CHEST:
147 case INVTYPE_ROBE:
148 slots[0] = EQUIPMENT_SLOT_CHEST;
149 break;
150 case INVTYPE_WAIST:
151 slots[0] = EQUIPMENT_SLOT_WAIST;
152 break;
153 case INVTYPE_LEGS:
154 slots[0] = EQUIPMENT_SLOT_LEGS;
155 break;
156 case INVTYPE_FEET:
157 slots[0] = EQUIPMENT_SLOT_FEET;
158 break;
159 case INVTYPE_WRISTS:
160 slots[0] = EQUIPMENT_SLOT_WRISTS;
161 break;
162 case INVTYPE_HANDS:
163 slots[0] = EQUIPMENT_SLOT_HANDS;
164 break;
165 case INVTYPE_FINGER:
166 slots[0] = EQUIPMENT_SLOT_FINGER1;
167 slots[1] = EQUIPMENT_SLOT_FINGER2;
168 break;
169 case INVTYPE_TRINKET:
170 slots[0] = EQUIPMENT_SLOT_TRINKET1;
171 slots[1] = EQUIPMENT_SLOT_TRINKET2;
172 break;
173 case INVTYPE_CLOAK:
174 slots[0] = EQUIPMENT_SLOT_BACK;
175 break;
176 case INVTYPE_WEAPON:
177 {
178 slots[0] = EQUIPMENT_SLOT_MAINHAND;
179
180 // suggest offhand slot only if know dual wielding
181 // (this will be replace mainhand weapon at auto equip instead unwonted "you don't known dual wielding" ...
182 if (CanDualWield())
183 slots[1] = EQUIPMENT_SLOT_OFFHAND;
184 break;
185 }
186 case INVTYPE_SHIELD:
188 case INVTYPE_HOLDABLE:
189 slots[0] = EQUIPMENT_SLOT_OFFHAND;
190 break;
191 case INVTYPE_RANGED:
193 case INVTYPE_THROWN:
194 slots[0] = EQUIPMENT_SLOT_RANGED;
195 break;
196 case INVTYPE_2HWEAPON:
197 slots[0] = EQUIPMENT_SLOT_MAINHAND;
198 if (CanDualWield() && CanTitanGrip() && proto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && proto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && proto->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
200 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
201 if (mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
202 slots[1] = EQUIPMENT_SLOT_OFFHAND;
203 break;
204 case INVTYPE_TABARD:
205 slots[0] = EQUIPMENT_SLOT_TABARD;
206 break;
208 slots[0] = EQUIPMENT_SLOT_MAINHAND;
209 break;
210 case INVTYPE_BAG:
211 slots[0] = INVENTORY_SLOT_BAG_START + 0;
212 slots[1] = INVENTORY_SLOT_BAG_START + 1;
213 slots[2] = INVENTORY_SLOT_BAG_START + 2;
214 slots[3] = INVENTORY_SLOT_BAG_START + 3;
215 break;
216 case INVTYPE_RELIC:
217 {
218 switch (proto->SubClass)
219 {
222 slots[0] = EQUIPMENT_SLOT_RANGED;
223 break;
226 slots[0] = EQUIPMENT_SLOT_RANGED;
227 break;
230 slots[0] = EQUIPMENT_SLOT_RANGED;
231 break;
234 slots[0] = EQUIPMENT_SLOT_RANGED;
235 break;
238 slots[0] = EQUIPMENT_SLOT_RANGED;
239 break;
240 }
241 break;
242 }
243 default:
244 return NULL_SLOT;
245 }
246
247 if (slot != NULL_SLOT)
248 {
249 if (swap || !GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
250 for (uint8 i = 0; i < 4; ++i)
251 if (slots[i] == slot)
252 return slot;
253 }
254 else
255 {
256 // search free slot at first
257 for (uint8 i = 0; i < 4; ++i)
258 if (slots[i] != NULL_SLOT && !GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i]))
259 // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free
260 if (slots[i] != EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed())
261 return slots[i];
262
263 // if not found free and can swap return first appropriate from used
264 for (uint8 i = 0; i < 4; ++i)
265 if (slots[i] != NULL_SLOT && swap)
266 return slots[i];
267 }
268
269 // no free position
270 return NULL_SLOT;
271}
@ EQUIPMENT_SLOT_SHOULDERS
Definition: Player.h:683
@ EQUIPMENT_SLOT_BODY
Definition: Player.h:684
@ EQUIPMENT_SLOT_HANDS
Definition: Player.h:690
@ EQUIPMENT_SLOT_NECK
Definition: Player.h:682
@ EQUIPMENT_SLOT_TABARD
Definition: Player.h:699
@ EQUIPMENT_SLOT_HEAD
Definition: Player.h:681
@ EQUIPMENT_SLOT_LEGS
Definition: Player.h:687
@ EQUIPMENT_SLOT_BACK
Definition: Player.h:695
@ EQUIPMENT_SLOT_WAIST
Definition: Player.h:686
@ EQUIPMENT_SLOT_FEET
Definition: Player.h:688
@ EQUIPMENT_SLOT_CHEST
Definition: Player.h:685
@ EQUIPMENT_SLOT_WRISTS
Definition: Player.h:689
@ INVTYPE_BODY
Definition: ItemTemplate.h:260
@ INVTYPE_FINGER
Definition: ItemTemplate.h:267
@ INVTYPE_HEAD
Definition: ItemTemplate.h:257
@ INVTYPE_ROBE
Definition: ItemTemplate.h:276
@ INVTYPE_HOLDABLE
Definition: ItemTemplate.h:279
@ INVTYPE_TRINKET
Definition: ItemTemplate.h:268
@ INVTYPE_RANGED
Definition: ItemTemplate.h:271
@ INVTYPE_THROWN
Definition: ItemTemplate.h:281
@ INVTYPE_WAIST
Definition: ItemTemplate.h:262
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:282
@ INVTYPE_WRISTS
Definition: ItemTemplate.h:265
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:277
@ INVTYPE_BAG
Definition: ItemTemplate.h:274
@ INVTYPE_NECK
Definition: ItemTemplate.h:258
@ INVTYPE_SHOULDERS
Definition: ItemTemplate.h:259
@ INVTYPE_FEET
Definition: ItemTemplate.h:264
@ INVTYPE_SHIELD
Definition: ItemTemplate.h:270
@ INVTYPE_TABARD
Definition: ItemTemplate.h:275
@ INVTYPE_LEGS
Definition: ItemTemplate.h:263
@ INVTYPE_CHEST
Definition: ItemTemplate.h:261
@ INVTYPE_HANDS
Definition: ItemTemplate.h:266

References Unit::CanDualWield(), CanTitanGrip(), CLASS_CONTEXT_EQUIP_RELIC, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARLOCK, EQUIPMENT_SLOT_BACK, EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_CHEST, EQUIPMENT_SLOT_FEET, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_HANDS, EQUIPMENT_SLOT_HEAD, EQUIPMENT_SLOT_LEGS, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_NECK, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_SHOULDERS, EQUIPMENT_SLOT_TABARD, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, EQUIPMENT_SLOT_WAIST, EQUIPMENT_SLOT_WRISTS, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_BAG, INVTYPE_BODY, INVTYPE_CHEST, INVTYPE_CLOAK, INVTYPE_FEET, INVTYPE_FINGER, INVTYPE_HANDS, INVTYPE_HEAD, INVTYPE_HOLDABLE, INVTYPE_LEGS, INVTYPE_NECK, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_RELIC, INVTYPE_ROBE, INVTYPE_SHIELD, INVTYPE_SHOULDERS, INVTYPE_TABARD, INVTYPE_THROWN, INVTYPE_TRINKET, INVTYPE_WAIST, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, INVTYPE_WRISTS, IsClass(), IsTwoHandUsed(), ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, NULL_SLOT, and ItemTemplate::SubClass.

Referenced by CanEquipItem(), and WorldSession::HandleAutoEquipItemOpcode().

◆ FindQuestSlot()

uint16 Player::FindQuestSlot ( uint32  quest_id) const

◆ GetAchievementMgr()

AchievementMgr * Player::GetAchievementMgr ( ) const
inline
2546{ return m_achievementMgr; }

References m_achievementMgr.

◆ GetActionButton()

ActionButton const * Player::GetActionButton ( uint8  button)
5660{
5661 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5662 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5663 return nullptr;
5664
5665 return &buttonItr->second;
5666}

References ACTIONBUTTON_DELETED, and m_actionButtons.

Referenced by Spell::EffectCastButtons().

◆ GetActiveSpec()

◆ GetActiveSpecMask()

uint8 Player::GetActiveSpecMask ( ) const
inline

◆ GetAmmoDPS()

float Player::GetAmmoDPS ( ) const
inline
1340{ return m_ammoDPS; }

References m_ammoDPS.

Referenced by _ApplyAmmoBonuses(), and CalculateMinMaxDamage().

◆ GetArenaPersonalRating()

uint32 Player::GetArenaPersonalRating ( uint8  slot) const
16144{
16146
16147 sScriptMgr->OnPlayerGetArenaPersonalRating(const_cast<Player*>(this), slot, result);
16148
16149 return result;
16150}

References ARENA_TEAM_END, ARENA_TEAM_PERSONAL_RATING, Object::GetUInt32Value(), PLAYER_FIELD_ARENA_TEAM_INFO_1_1, and sScriptMgr.

Referenced by GetMaxPersonalArenaRatingRequirement().

◆ GetArenaPoints()

uint32 Player::GetArenaPoints ( ) const
inline

◆ GetArenaTeamId()

◆ GetArenaTeamIdFromDB()

uint32 Player::GetArenaTeamIdFromDB ( ObjectGuid  guid,
uint8  slot 
)
static
6325{
6327 stmt->SetData(0, guid.GetCounter());
6328 stmt->SetData(1, type);
6329 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6330
6331 if (!result)
6332 return 0;
6333
6334 uint32 id = (*result)[0].Get<uint32>();
6335 return id;
6336}
@ CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID
Definition: CharacterDatabase.h:352

References CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, CharacterDatabase, ObjectGuid::GetCounter(), and PreparedStatementBase::SetData().

Referenced by arena_commandscript::HandleArenaCreateCommand().

◆ GetArenaTeamIdInvited()

◆ GetArmorProficiency()

uint32 Player::GetArmorProficiency ( ) const
inline
1373{ return m_ArmorProficiency; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ GetAttackBySlot()

◆ GetAurasForTarget()

void Player::GetAurasForTarget ( Unit target,
bool  force = false 
)

Blizz sends certain movement packets sometimes even before CreateObject These movement packets are usually found in SMSG_COMPRESSED_MOVES

12009{
12010 if (!target || (!force && target->GetVisibleAuras()->empty())) // speedup things
12011 return;
12012
12016 if (target->HasFeatherFallAura())
12017 target->SendMovementFeatherFall(this);
12018
12019 if (target->HasWaterWalkAura())
12020 target->SendMovementWaterWalking(this);
12021
12022 if (target->HasHoverAura())
12023 target->SendMovementHover(this);
12024
12026 data<< target->GetPackGUID();
12027
12028 Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras();
12029 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
12030 {
12031 AuraApplication* auraApp = itr->second;
12032 auraApp->BuildUpdatePacket(data, false);
12033 }
12034
12035 GetSession()->SendPacket(&data);
12036}
@ SMSG_AURA_UPDATE_ALL
Definition: Opcodes.h:1203
bool HasWaterWalkAura() const
Definition: Unit.h:1705
bool HasFeatherFallAura() const
Definition: Unit.h:1706
void SendMovementHover(Player *sendTo)
Definition: Unit.cpp:20469
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:642
void SendMovementWaterWalking(Player *sendTo)
Definition: Unit.cpp:20410
bool HasHoverAura() const
Definition: Unit.h:1707
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:1456
void SendMovementFeatherFall(Player *sendTo)
Definition: Unit.cpp:20432
Definition: SpellAuras.h:37
void BuildUpdatePacket(ByteBuffer &data, bool remove) const
Definition: SpellAuras.cpp:248

References AuraApplication::BuildUpdatePacket(), Object::GetPackGUID(), GetSession(), Unit::GetVisibleAuras(), Unit::HasFeatherFallAura(), Unit::HasHoverAura(), Unit::HasWaterWalkAura(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), WorldSession::SendPacket(), and SMSG_AURA_UPDATE_ALL.

Referenced by GetInitialVisiblePackets(), and Map::SendInitSelf().

◆ GetAuraUpdateMaskForRaid()

uint64 Player::GetAuraUpdateMaskForRaid ( ) const
inline

◆ GetAverageItemLevel()

float Player::GetAverageItemLevel ( )
15665{
15666 float sum = 0;
15667 uint32 count = 0;
15668 uint8 level = GetLevel();
15669
15671 {
15672 // don't check tabard, ranged, offhand or shirt
15674 continue;
15675
15676 if (m_items[i] && m_items[i]->GetTemplate())
15678
15679 ++count;
15680 }
15681
15682 return std::max<float>(0.0f, sum / (float)count);
15683}
float GetItemLevelIncludingQuality(uint8 pLevel) const
Definition: ItemTemplate.h:759

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, ItemTemplate::GetItemLevelIncludingQuality(), Unit::GetLevel(), Item::GetTemplate(), and m_items.

Referenced by spell_gen_vehicle_scaling_aura::CalculateAmount(), gear_commandscript::HandleGearStatsCommand(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetAverageItemLevelForDF()

float Player::GetAverageItemLevelForDF ( )
15686{
15687 float sum = 0;
15688 uint32 count = 0;
15689 uint8 level = GetLevel();
15690
15691 for (int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
15692 {
15693 // don't check tabard, ranged, offhand or shirt
15695 continue;
15696
15697 if (m_items[i] && m_items[i]->GetTemplate())
15698 {
15699 if (m_items[i]->GetTemplate()->Quality == ITEM_QUALITY_HEIRLOOM)
15700 sum += level * 2.33f;
15701 else
15702 sum += m_items[i]->GetTemplate()->ItemLevel;
15703 }
15704
15705 ++count;
15706 }
15707
15708 return std::max(0.0f, sum / (float)count);
15709}

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, Unit::GetLevel(), Item::GetTemplate(), ITEM_QUALITY_HEIRLOOM, ItemTemplate::ItemLevel, and m_items.

Referenced by lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ GetBagByPos()

◆ GetBankBagSlotCount()

uint8 Player::GetBankBagSlotCount ( ) const
inline

◆ GetBarberShopCost()

uint32 Player::GetBarberShopCost ( uint8  newhairstyle,
uint8  newhaircolor,
uint8  newfacialhair,
BarberShopStyleEntry const *  newSkin = nullptr 
)
13195{
13196 uint8 level = GetLevel();
13197
13198 if (level > GT_MAX_LEVEL)
13199 level = GT_MAX_LEVEL; // max level in this dbc
13200
13201 uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2);
13202 uint8 haircolor = GetByteValue(PLAYER_BYTES, 3);
13203 uint8 facialhair = GetByteValue(PLAYER_BYTES_2, 0);
13204 uint8 skincolor = GetByteValue(PLAYER_BYTES, 0);
13205
13206 if ((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair) && (!newSkin || (newSkin->hair_id == skincolor)))
13207 return 0;
13208
13209 GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1);
13210
13211 if (!bsc) // shouldn't happen
13212 return 0xFFFFFFFF;
13213
13214 float cost = 0;
13215
13216 if (hairstyle != newhairstyle)
13217 cost += bsc->cost; // full price
13218
13219 if ((haircolor != newhaircolor) && (hairstyle == newhairstyle))
13220 cost += bsc->cost * 0.5f; // +1/2 of price
13221
13222 if (facialhair != newfacialhair)
13223 cost += bsc->cost * 0.75f; // +3/4 of price
13224
13225 if (newSkin && skincolor != newSkin->hair_id)
13226 cost += bsc->cost * 0.75f; // +5/6 of price
13227
13228 return uint32(cost);
13229}
DBCStorage< GtBarberShopCostBaseEntry > sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt)
#define GT_MAX_LEVEL
Definition: DBCStructure.h:1037
Definition: DBCStructure.h:1043
float cost
Definition: DBCStructure.h:1044

References GtBarberShopCostBaseEntry::cost, Object::GetByteValue(), Unit::GetLevel(), GT_MAX_LEVEL, BarberShopStyleEntry::hair_id, PLAYER_BYTES, PLAYER_BYTES_2, and sGtBarberShopCostBaseStore.

Referenced by WorldSession::HandleAlterAppearance().

◆ GetBaseDefenseSkillValue()

uint32 Player::GetBaseDefenseSkillValue ( ) const
inline
@ SKILL_DEFENSE
Definition: SharedDefines.h:2881
uint16 GetBaseSkillValue(uint32 skill) const
Definition: Player.cpp:5509

References GetBaseSkillValue(), and SKILL_DEFENSE.

Referenced by UpdateCombatSkills().

◆ GetBaseModValue()

float Player::GetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType 
) const
5067{
5068 if (modGroup >= BASEMOD_END)
5069 {
5070 LOG_ERROR("entities.player", "trial to access non existed BaseModGroup!");
5071 return 0.0f;
5072 }
5073
5074 if (modType == PCT_MOD && m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5075 return 0.0f;
5076
5077 return m_auraBaseMod[modGroup][modType];
5078}

References BASEMOD_END, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetBaseRune()

RuneType Player::GetBaseRune ( uint8  index) const
inline
2516{ return RuneType(m_runes->runes[index].BaseRune); }
RuneType
Definition: Player.h:414
uint8 BaseRune
Definition: Player.h:424
RuneInfo runes[MAX_RUNES]
Definition: Player.h:433

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by Spell::EffectActivateRune(), GetRuneBaseCooldown(), IsBaseRuneSlotsOnCooldown(), RemoveRunesByAuraEffect(), RestoreBaseRune(), Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetBaseSkillValue()

uint16 Player::GetBaseSkillValue ( uint32  skill) const
5510{
5511 if (!skill)
5512 return 0;
5513
5514 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5515 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5516 return 0;
5517
5518 int32 result = int32(SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5519 result += SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos)));
5520 return result < 0 ? 0 : result;
5521}
#define SKILL_PERM_BONUS(x)
Definition: Player.h:87

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_VALUE.

Referenced by npc_engineering_tele_trinket::CanLearn(), GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), GetTrainerSpellState(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), and SatisfyQuestSkill().

◆ GetBaseSpellPowerBonus()

uint32 Player::GetBaseSpellPowerBonus ( )
inline

◆ GetBaseWeaponSkillValue()

uint32 Player::GetBaseWeaponSkillValue ( WeaponAttackType  attType) const
12758{
12759 Item* item = GetWeaponForAttack(attType, true);
12760
12761 // unarmed only with base attack
12762 if (attType != BASE_ATTACK && !item)
12763 return 0;
12764
12765 // weapon skill or (unarmed for base attack)
12766 uint32 skill = item ? item->GetSkill() : uint32(SKILL_UNARMED);
12767 return GetBaseSkillValue(skill);
12768}
@ SKILL_UNARMED
Definition: SharedDefines.h:2907

References BASE_ATTACK, GetBaseSkillValue(), Item::GetSkill(), GetWeaponForAttack(), and SKILL_UNARMED.

Referenced by UpdateCombatSkills().

◆ GetBattleground()

Battleground * Player::GetBattleground ( bool  create = false) const
12145{
12146 if (GetBattlegroundId() == 0)
12147 return nullptr;
12148
12150 return (create || (bg && bg->FindBgMap()) ? bg : nullptr);
12151}
#define sBattlegroundMgr
Definition: BattlegroundMgr.h:187
BattlegroundMap * FindBgMap() const
Definition: Battleground.h:441
BattlegroundTypeId GetBattlegroundTypeId() const
Definition: Player.h:2265
uint32 GetBattlegroundId() const
Definition: Player.h:2264

References Battleground::FindBgMap(), GetBattlegroundId(), GetBattlegroundTypeId(), and sBattlegroundMgr.

Referenced by GameObject::ActivateToQuest(), CanEquipItem(), Group::CanJoinBattlegroundQueue(), CanUnequipItem(), Spell::CheckCast(), MapInstanced::CreateInstanceForPlayer(), Object::DestroyForPlayer(), Spell::EffectOpenLock(), WorldSession::HandleAreaSpiritHealerQueryOpcode(), WorldSession::HandleAreaSpiritHealerQueueOpcode(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModEffectImmunity(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlegroundPlayerPositionsOpcode(), spell_item_rocket_boots::HandleDummy(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePVPLogDataOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), spell_ioc_gunship_portal::HandleScript2(), InArena(), SpellArea::IsFitToRequirements(), Unit::Kill(), LeaveBattleground(), AchievementCriteriaData::Meets(), Unit::Mount(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_arena_by_type::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_sa_defense_of_the_ancients::OnCheck(), achievement_not_even_a_scratch::OnCheck(), achievement_save_the_day::OnCheck(), go_arena_ready_marker::OnGossipHello(), RepopAtGraveyard(), ReportedAfkBy(), ResurrectPlayer(), RewardHonor(), SendInitWorldStates(), SendLoot(), SummonIfPossible(), AchievementMgr::UpdateAchievementCriteria(), and GameObject::Use().

◆ GetBattlegroundId()

◆ GetBattlegroundQueueIndex()

◆ GetBattlegroundQueueTypeId()

BattlegroundQueueTypeId Player::GetBattlegroundQueueTypeId ( uint32  index) const

◆ GetBattlegroundTypeId()

BattlegroundTypeId Player::GetBattlegroundTypeId ( ) const
inline
2265{ return m_bgData.bgTypeID; }
BattlegroundTypeId bgTypeID
Definition: Player.h:1042

References BGData::bgTypeID, and m_bgData.

Referenced by GetBattleground(), and ArenaSpectator::HandleSpectatorSpectateCommand().

◆ GetBGAccessByLevel()

bool Player::GetBGAccessByLevel ( BattlegroundTypeId  bgTypeId) const
12267{
12268 // get a template bg instead of running one
12269 Battleground* bgt = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
12270 if (!bgt)
12271 return false;
12272
12273 // limit check leel to dbc compatible level range
12274 uint32 level = GetLevel();
12275 if (level > DEFAULT_MAX_LEVEL)
12276 level = DEFAULT_MAX_LEVEL;
12277
12278 if (level < bgt->GetMinLevel() || level > bgt->GetMaxLevel())
12279 return false;
12280
12281 return true;
12282}
uint32 GetMaxLevel() const
Definition: Battleground.h:330

References DEFAULT_MAX_LEVEL, Unit::GetLevel(), Battleground::GetMaxLevel(), and sBattlegroundMgr.

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), and Creature::isCanInteractWithBattleMaster().

◆ GetBGData()

BGData & Player::GetBGData ( )
inline
2269{ return m_bgData; }

References m_bgData.

◆ GetBgTeamId()

◆ GetBonusTalentCount()

uint32 Player::GetBonusTalentCount ( )
inline
1743{ return m_extraBonusTalentCount; };

References m_extraBonusTalentCount.

◆ GetCastRequest()

const PendingSpellCastRequest * Player::GetCastRequest ( uint32  category) const
2330{
2331 for (const PendingSpellCastRequest& request : SpellQueue)
2332 if (request.category == category)
2333 return &request;
2334 return nullptr;
2335}
Definition: Player.h:1070
std::deque< PendingSpellCastRequest > SpellQueue
Definition: Player.h:2653

References SpellQueue.

Referenced by CanRequestSpellCast().

◆ GetChampioningFaction()

uint32 Player::GetChampioningFaction ( ) const
inline
2560{ return m_ChampioningFaction; }

References m_ChampioningFaction.

Referenced by RewardReputation().

◆ GetChatTag()

uint8 Player::GetChatTag ( ) const
1313{
1314 uint8 tag = CHAT_TAG_NONE;
1315
1316 if (isGMChat())
1317 tag |= CHAT_TAG_GM;
1318 if (isDND())
1319 tag |= CHAT_TAG_DND;
1320 if (isAFK())
1321 tag |= CHAT_TAG_AFK;
1322 if (IsCommentator())
1323 tag |= CHAT_TAG_COM;
1324 if (IsDeveloper())
1325 tag |= CHAT_TAG_DEV;
1326
1327 return tag;
1328}
@ CHAT_TAG_COM
Definition: Player.h:855
@ CHAT_TAG_DND
Definition: Player.h:853
@ CHAT_TAG_DEV
Definition: Player.h:856
@ CHAT_TAG_AFK
Definition: Player.h:852
@ CHAT_TAG_GM
Definition: Player.h:854
@ CHAT_TAG_NONE
Definition: Player.h:851
bool IsCommentator() const
Definition: Player.h:1170
bool isGMChat() const
Definition: Player.h:1178
bool isDND() const
Definition: Player.h:1153
bool IsDeveloper() const
Definition: Player.h:1172
bool isAFK() const
Definition: Player.h:1152

References CHAT_TAG_AFK, CHAT_TAG_COM, CHAT_TAG_DEV, CHAT_TAG_DND, CHAT_TAG_GM, CHAT_TAG_NONE, isAFK(), IsCommentator(), IsDeveloper(), isDND(), and isGMChat().

◆ getCinematic()

uint8 Player::getCinematic ( ) const
inline
1840 {
1841 return m_cinematic;
1842 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ GetCinematicMgr()

CinematicMgr * Player::GetCinematicMgr ( ) const
inline

◆ GetCommandStatus()

◆ GetCorpse()

◆ GetCorpseLocation()

◆ GetCorpseReclaimDelay()

uint32 Player::GetCorpseReclaimDelay ( bool  pvp) const
12865{
12866 if (pvp)
12867 {
12868 if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP))
12869 return copseReclaimDelay[0];
12870 }
12871 else if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE))
12872 return 0;
12873
12874 time_t now = GameTime::GetGameTime().count();
12875 // 0..2 full period
12876 // should be std::ceil(x)-1 but not floor(x)
12877 uint64 count = (now < m_deathExpireTime - 1) ? (m_deathExpireTime - 1 - now) / DEATH_EXPIRE_STEP : 0;
12878 return copseReclaimDelay[count];
12879}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, and sWorld.

Referenced by CalculateCorpseReclaimDelay(), and WorldSession::HandleReclaimCorpseOpcode().

◆ GetCreationTime()

Seconds Player::GetCreationTime ( ) const
inline
2549{ return m_creationTime; }

References m_creationTime.

◆ GetCurrentBattlegroundQueueSlot()

uint32 Player::GetCurrentBattlegroundQueueSlot ( ) const
inline

◆ GetCurrentRune()

RuneType Player::GetCurrentRune ( uint8  index) const
inline

◆ GetDeathTimer()

uint32 Player::GetDeathTimer ( ) const
inline
2186{ return m_deathTimer; }

References m_deathTimer.

Referenced by WorldSession::LogoutPlayer().

◆ GetDebugInfo()

std::string Player::GetDebugInfo ( ) const
overridevirtual

Reimplemented from WorldObject.

16293{
16294 std::stringstream sstr;
16295 sstr << Unit::GetDebugInfo();
16296 return sstr.str();
16297}
std::string GetDebugInfo() const override
Definition: Unit.cpp:21100

References Unit::GetDebugInfo().

◆ GetDeclinedNames()

DeclinedName const * Player::GetDeclinedNames ( ) const
inline
2514{ return m_declinedname; }

References m_declinedname.

◆ GetDefaultGossipMenuForSource()

uint32 Player::GetDefaultGossipMenuForSource ( WorldObject source)
static
423{
424 switch (source->GetTypeId())
425 {
426 case TYPEID_UNIT:
427 return source->ToCreature()->GetCreatureTemplate()->GossipMenuId;
429 return source->ToGameObject()->GetGOInfo()->GetGossipMenuId();
430 default:
431 break;
432 }
433
434 return 0;
435}
uint32 GossipMenuId
Definition: CreatureData.h:194
GameObjectTemplate const * GetGOInfo() const
Definition: GameObject.h:136
uint32 GetGossipMenuId() const
Definition: GameObjectData.h:552

References Creature::GetCreatureTemplate(), GameObject::GetGOInfo(), GameObjectTemplate::GetGossipMenuId(), Object::GetTypeId(), CreatureTemplate::GossipMenuId, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GetGossipTextId(), and PrepareGossipMenu().

◆ GetDelayedOperations()

uint32 Player::GetDelayedOperations ( ) const
inline

◆ GetDifficulty()

◆ GetDivider()

◆ GetDodgeFromAgility()

void Player::GetDodgeFromAgility ( float &  diminishing,
float &  nondiminishing 
)
Todo:
: research if talents/effects that increase total agility by x% should increase non-diminishing part
5121{
5122 // Table for base dodge values
5123 const float dodge_base[MAX_CLASSES] =
5124 {
5125 0.036640f, // Warrior
5126 0.034943f, // Paladi
5127 -0.040873f, // Hunter
5128 0.020957f, // Rogue
5129 0.034178f, // Priest
5130 0.036640f, // DK
5131 0.021080f, // Shaman
5132 0.036587f, // Mage
5133 0.024211f, // Warlock
5134 0.0f, // ??
5135 0.056097f // Druid
5136 };
5137 // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15%
5138 const float crit_to_dodge[MAX_CLASSES] =
5139 {
5140 0.85f / 1.15f, // Warrior
5141 1.00f / 1.15f, // Paladin
5142 1.11f / 1.15f, // Hunter
5143 2.00f / 1.15f, // Rogue
5144 1.00f / 1.15f, // Priest
5145 0.85f / 1.15f, // DK
5146 1.60f / 1.15f, // Shaman
5147 1.00f / 1.15f, // Mage
5148 0.97f / 1.15f, // Warlock (?)
5149 0.0f, // ??
5150 2.00f / 1.15f // Druid
5151 };
5152
5153 uint8 level = GetLevel();
5154 uint32 pclass = getClass();
5155
5156 if (level > GT_MAX_LEVEL)
5157 level = GT_MAX_LEVEL;
5158
5159 // Dodge per agility is proportional to crit per agility, which is available from DBC files
5160 GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5161 if (!dodgeRatio || pclass > MAX_CLASSES)
5162 return;
5163
5166 float bonus_agility = GetStat(STAT_AGILITY) - base_agility;
5167
5168 // calculate diminishing (green in char screen) and non-diminishing (white) contribution
5169 diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1];
5170 nondiminishing = 100.0f * (dodge_base[pclass - 1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1]);
5171}
DBCStorage< GtChanceToMeleeCritEntry > sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt)
@ UNIT_MOD_STAT_START
Definition: Unit.h:171
#define MAX_CLASSES
Definition: SharedDefines.h:155
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:2082
float GetCreateStat(Stats stat) const
Definition: Unit.h:1000
Definition: DBCStructure.h:1058
float ratio
Definition: DBCStructure.h:1059

References BASE_PCT, Unit::getClass(), Unit::GetCreateStat(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, Unit::m_auraModifiersGroup, MAX_CLASSES, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritStore, STAT_AGILITY, and UNIT_MOD_STAT_START.

Referenced by UpdateDodgePercentage().

◆ GetDrunkenstateByValue()

DrunkenState Player::GetDrunkenstateByValue ( uint8  value)
static
967{
968 if (value >= 90)
969 return DRUNKEN_SMASHED;
970 if (value >= 50)
971 return DRUNKEN_DRUNK;
972 if (value)
973 return DRUNKEN_TIPSY;
974 return DRUNKEN_SOBER;
975}
@ DRUNKEN_TIPSY
Definition: Player.h:471
@ DRUNKEN_DRUNK
Definition: Player.h:472
@ DRUNKEN_SOBER
Definition: Player.h:470
@ DRUNKEN_SMASHED
Definition: Player.h:473

References DRUNKEN_DRUNK, DRUNKEN_SMASHED, DRUNKEN_SOBER, and DRUNKEN_TIPSY.

Referenced by Condition::Meets(), AchievementCriteriaData::Meets(), and SetDrunkValue().

◆ GetDrunkValue()

◆ GetDungeonDifficulty()

◆ GetEntryPoint()

WorldLocation const & Player::GetEntryPoint ( ) const
inline

◆ GetExpertiseDodgeOrParryReduction()

float Player::GetExpertiseDodgeOrParryReduction ( WeaponAttackType  attType) const
5212{
5213 switch (attType)
5214 {
5215 case BASE_ATTACK:
5216 return m_Expertise / 4.0f;
5217 case OFF_ATTACK:
5218 return m_OffhandExpertise / 4.0f;
5219 default:
5220 break;
5221 }
5222 return 0.0f;
5223}
float m_OffhandExpertise
Definition: Player.h:2890
float m_Expertise
Definition: Player.h:2889

References BASE_ATTACK, m_Expertise, m_OffhandExpertise, and OFF_ATTACK.

◆ GetFakeDrunkValue()

int32 Player::GetFakeDrunkValue ( ) const
inline
@ PLAYER_FAKE_INEBRIATION
Definition: UpdateFields.h:325
int32 GetInt32Value(uint16 index) const
Definition: Object.cpp:299

References Object::GetInt32Value(), and PLAYER_FAKE_INEBRIATION.

Referenced by UpdateInvisibilityDrunkDetect().

◆ GetFarSightDistance()

Optional< float > Player::GetFarSightDistance ( ) const
16222{
16223 return _farSightDistance;
16224}
Optional< float > _farSightDistance
Definition: Player.h:3016

References _farSightDistance.

◆ GetFreeInventorySpace()

uint32 Player::GetFreeInventorySpace ( ) const
467{
468 uint32 freeSpace = 0;
469
470 // Check backpack
471 for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
472 {
474 if (!item)
475 freeSpace += 1;
476 }
477
478 // Check bags
480 {
481 if (Bag* bag = GetBagByPos(i))
482 freeSpace += bag->GetFreeSlots();
483 }
484
485 return freeSpace;
486}

References GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::CheckItems().

◆ GetFreePrimaryProfessionPoints()

uint32 Player::GetFreePrimaryProfessionPoints ( ) const
inline

◆ GetFreeTalentPoints()

uint32 Player::GetFreeTalentPoints ( ) const
inline
@ PLAYER_CHARACTER_POINTS1
Definition: UpdateFields.h:342

References Object::GetUInt32Value(), and PLAYER_CHARACTER_POINTS1.

Referenced by BuildPlayerTalentsInfoData(), and LearnTalent().

◆ GetGameObjectIfCanInteractWith()

GameObject * Player::GetGameObjectIfCanInteractWith ( ObjectGuid  guid,
GameobjectTypes  type 
) const
2141{
2142 if (GameObject* go = GetMap()->GetGameObject(guid))
2143 {
2144 if (go->GetGoType() == type)
2145 {
2146 // Players cannot interact with gameobjects that use the "Point" icon
2147 if (go->GetGOInfo()->IconName == "Point")
2148 {
2149 return nullptr;
2150 }
2151
2152 if (go->IsWithinDistInMap(this))
2153 {
2154 return go;
2155 }
2156
2157 LOG_DEBUG("maps", "IsGameObjectOfTypeInRange: GameObject '{}' [{}] is too far away from player {} [{}] to be used by him (distance={}, maximal 10 is allowed)",
2158 go->GetGOInfo()->name, go->GetGUID().ToString(), GetName(), GetGUID().ToString(), go->GetDistance(this));
2159 }
2160 }
2161 return nullptr;
2162}
GameObject * GetGameObject(uint32 spellId) const
Definition: Unit.cpp:6225

References Unit::GetGameObject(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetName(), LOG_DEBUG, and Position::ToString().

Referenced by CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), and WorldSession::HandleGuildBankerActivate().

◆ GetGlobalCooldownMgr()

GlobalCooldownMgr & Player::GetGlobalCooldownMgr ( )
inline

◆ GetGlyph()

◆ GetGlyphSlot()

uint32 Player::GetGlyphSlot ( uint8  slot) const
inline
@ PLAYER_FIELD_GLYPH_SLOTS_1
Definition: UpdateFields.h:388

References Object::GetUInt32Value(), and PLAYER_FIELD_GLYPH_SLOTS_1.

Referenced by _LoadGlyphAuras(), and Spell::EffectApplyGlyph().

◆ GetGossipTextId() [1/2]

uint32 Player::GetGossipTextId ( uint32  menuId,
WorldObject source 
)
405{
407
408 if (!menuId)
409 return textId;
410
411 GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(menuId);
412
413 for (GossipMenusContainer::const_iterator itr = menuBounds.first; itr != menuBounds.second; ++itr)
414 {
415 if (sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
416 textId = itr->second.TextID;
417 }
418
419 return textId;
420}
#define DEFAULT_GOSSIP_MESSAGE
Definition: GossipDef.h:31
std::pair< GossipMenusContainer::const_iterator, GossipMenusContainer::const_iterator > GossipMenusMapBounds
Definition: ObjectMgr.h:631

References DEFAULT_GOSSIP_MESSAGE, sConditionMgr, and sObjectMgr.

Referenced by GetGossipTextId(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), boss_gloomrel::OnGossipHello(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_zulaman_hostage::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_high_overlord_saurfang_icc::OnGossipHello(), npc_muradin_bronzebeard_icc::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_drake_dealer_hurlunk::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_zephyr::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_engineering_tele_trinket::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_sayge::OnGossipHello(), npc_wormhole::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_experience::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), icecrown_citadel_teleport::OnGossipHello(), npc_prof_blacksmith::SendActionMenu(), npc_prof_alchemy::SendConfirmLearn(), npc_prof_blacksmith::SendConfirmLearn(), npc_prof_tailor::SendConfirmLearn(), go_evil_book_for_dummies::SendConfirmLearn(), npc_prof_alchemy::SendConfirmUnlearn(), npc_prof_blacksmith::SendConfirmUnlearn(), npc_prof_tailor::SendConfirmUnlearn(), go_evil_book_for_dummies::SendConfirmUnlearn(), SendPreparedGossip(), SendPreparedQuest(), npc_echo_of_medivh::sGossipHello(), and npc_chesspiece::sGossipHello().

◆ GetGossipTextId() [2/2]

uint32 Player::GetGossipTextId ( WorldObject source)
397{
398 if (!source)
400
401 return GetGossipTextId(GetDefaultGossipMenuForSource(source), source);
402}
static uint32 GetDefaultGossipMenuForSource(WorldObject *source)
Definition: PlayerGossip.cpp:422
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition: PlayerGossip.cpp:404

References DEFAULT_GOSSIP_MESSAGE, GetDefaultGossipMenuForSource(), and GetGossipTextId().

◆ GetGracePeriod()

uint32 Player::GetGracePeriod ( uint8  index) const
inline
2519{ return m_runes->runes[index].GracePeriod; }
uint32 GracePeriod
Definition: Player.h:427

References RuneInfo::GracePeriod, m_runes, and Runes::runes.

Referenced by GetRuneBaseCooldown(), and RegenerateAll().

◆ GetGrantableLevels()

uint8 Player::GetGrantableLevels ( )
inline

◆ GetGroup() [1/2]

Group * Player::GetGroup ( )
inline
2478{ return m_group.getTarget(); }
TO * getTarget() const
Definition: Reference.h:95
GroupReference m_group
Definition: Player.h:2908

References Reference< TO, FROM >::getTarget(), and m_group.

Referenced by _LoadGroup(), Group::AddInvite(), Loot::AddItem(), Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), Arena::AddPlayer(), InstanceMap::AddPlayerToMap(), LootItem::AllowedForPlayer(), Group::BroadcastPacket(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), InstanceMap::CannotEnter(), CanRollForItemInLFG(), CanUninviteFromGroup(), Spell::CheckCast(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), CheckInstanceLoginValid(), MapInstanced::CreateInstance(), MapInstanced::CreateInstanceForPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), ArenaTeam::DelMember(), Group::Disband(), WorldSession::DoLootRelease(), DoRandomRoll(), SmartAI::EndPath(), Loot::FillLoot(), GetNextRandomRaidMember(), Unit::GetNextRandomRaidMemberOrPet(), Unit::GetPartyMembers(), ChatHandler::GetPlayerGroupAndGUIDByName(), GetsRecruitAFriendBonus(), GroupEventHappens(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), Unit::HandleAuraRaidProcFromChargeWithValue(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), Unit::HandleDummyAuraProc(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupAssistantLeaderOpcode(), WorldSession::HandleGroupChangeSubGroupOpcode(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupInviteOpcode(), group_commandscript::HandleGroupJoinCommand(), WorldSession::HandleGroupRaidConvertOpcode(), group_commandscript::HandleGroupReviveCommand(), WorldSession::HandleGroupSetLeaderOpcode(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleGroupSwapSubGroupOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::HandleInstanceLockResponse(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), WorldSession::HandleLfgLeaveOpcode(), WorldSession::HandleLfgPartyLockInfoRequestOpcode(), WorldSession::HandleLfgSetRolesOpcode(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandleLootMethodOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMinimapPingOpcode(), WorldSession::HandlePartyAssignmentOpcode(), WorldSession::HandlePetRename(), Battlefield::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleRaidReadyCheckFinishedOpcode(), WorldSession::HandleRaidReadyCheckOpcode(), WorldSession::HandleRaidTargetUpdateOpcode(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), misc_commandscript::HandleSummonCommand(), tele_commandscript::HandleTeleGroupCommand(), HasQuestForGO(), HasQuestForItem(), isAllowedToLoot(), SmartAI::IsEscortInvokerInRange(), Unit::IsInPartyWith(), IsInSameGroupWith(), IsInSameRaidWith(), GameObject::IsLootAllowedFor(), Creature::isTappedBy(), lfg::LFGMgr::JoinLfg(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), npc_coren_direbrew::JustDied(), boss_headless_horseman::JustDied(), boss_ahune::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), Unit::Kill(), KilledMonsterCredit(), KilledPlayerCredit(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), lfg::LFGMgr::MakeNewGroup(), npc_icc_buff_switcher::OnGossipSelect(), lfg::LFGPlayerScript::OnPlayerBindToInstance(), lfg::LFGPlayerScript::OnPlayerLevelChanged(), lfg::LFGPlayerScript::OnPlayerLogin(), lfg::LFGPlayerScript::OnPlayerLogout(), lfg::LFGPlayerScript::OnPlayerMapChanged(), Acore::MostHPMissingGroupInRange::operator()(), InstanceMap::PermBindAllPlayers(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerGetDestinationInstanceId(), ProcessDelayedOperations(), RemoveFromGroup(), RemovePet(), RewardPlayerAndGroupAtEvent(), Group::SameSubGroup(), Satisfy(), SendInitialPacketsAfterAddToMap(), SendLoot(), SendNewItem(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendUpdateToOutOfRangeGroupMembers(), Group::SendUpdateToPlayer(), SetBattlegroundOrBattlefieldRaid(), Unit::SetHealth(), Creature::SetLootRecipient(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), Unit::setPowerType(), StoreLootItem(), lfg::LFGMgr::TeleportPlayer(), PetAI::UpdateAllies(), Unit::UpdateAuraForGroup(), UpdatePosition(), lfg::LFGMgr::UpdateRaidBrowser(), UpdateZone(), and GameObject::Use().

◆ GetGroup() [2/2]

const Group * Player::GetGroup ( ) const
inline
2479{ return (const Group*)m_group.getTarget(); }

References Reference< TO, FROM >::getTarget(), and m_group.

◆ GetGroupInvite()

◆ GetGroupRef()

GroupReference & Player::GetGroupRef ( )
inline
2480{ return m_group; }

References m_group.

◆ GetGroupUpdateFlag()

uint32 Player::GetGroupUpdateFlag ( ) const
inline

◆ GetGuild()

Guild * Player::GetGuild ( ) const
15947{
15948 uint32 guildId = GetGuildId();
15949 return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
15950}

References GetGuildId(), and sGuildMgr.

Referenced by GiveLevel(), WorldSession::HandleGuildBankerActivate(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleGuildRankOpcode(), Guild::HandleInviteMember(), and UpdateZone().

◆ GetGuildId()

◆ GetGuildIdInvited()

◆ GetGuildName()

std::string const & Player::GetGuildName ( )
15286{
15287 return sGuildMgr->GetGuildById(GetGuildId())->GetName();
15288}

References GetGuildId(), and sGuildMgr.

◆ GetHealthBonusFromStamina()

float Player::GetHealthBonusFromStamina ( )
277{
278 float stamina = GetStat(STAT_STAMINA);
279
280 float baseStam = stamina < 20 ? stamina : 20;
281 float moreStam = stamina - baseStam;
282
283 return baseStam + (moreStam * 10.0f);
284}

References Unit::GetStat(), and STAT_STAMINA.

Referenced by UpdateMaxHealth().

◆ GetHonorPoints()

◆ GetInGameTime()

uint32 Player::GetInGameTime ( )
inline
1562{ return m_ingametime; }

References m_ingametime.

◆ GetInitialVisiblePackets()

void Player::GetInitialVisiblePackets ( Unit target)
1707{
1708 GetAurasForTarget(target);
1709 if (target->IsAlive())
1710 {
1712 target->GetVictim())
1713 target->SendMeleeAttackStart(target->GetVictim(), this);
1714 }
1715}
@ UNIT_STATE_MELEE_ATTACKING
Definition: UnitDefines.h:171
void GetAurasForTarget(Unit *target, bool force=false)
Definition: Player.cpp:12008
Unit * GetVictim() const
Definition: Unit.h:846
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3075

References GetAurasForTarget(), Unit::GetVictim(), Unit::HasUnitState(), Unit::IsAlive(), Unit::SendMeleeAttackStart(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by Acore::VisibleNotifier::SendToSelf(), and UpdateVisibilityOf().

◆ GetInnTriggerId()

uint32 Player::GetInnTriggerId ( ) const
inline
1218{ return _innTriggerId; }

References _innTriggerId.

Referenced by Update().

◆ GetItemByEntry()

Item * Player::GetItemByEntry ( uint32  entry) const
3370{
3371 // in inventory
3373 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3374 if (pItem->GetEntry() == entry)
3375 return pItem;
3376
3378 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3379 if (pItem->GetEntry() == entry)
3380 return pItem;
3381
3382 for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
3383 if (Bag* pBag = GetBagByPos(i))
3384 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
3385 if (Item* pItem = pBag->GetItemByPos(j))
3386 if (pItem->GetEntry() == entry)
3387 return pItem;
3388
3389 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i)
3390 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3391 if (pItem->GetEntry() == entry)
3392 return pItem;
3393
3394 return nullptr;
3395}

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by Spell::CheckItems(), Spell::EffectRechargeManaGem(), and Spell::EffectStuck().

◆ GetItemByGuid()

Item * Player::GetItemByGuid ( ObjectGuid  guid) const
408{
410 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
411 if (pItem->GetGUID() == guid)
412 return pItem;
413
415 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
416 if (pItem->GetGUID() == guid)
417 return pItem;
418
419 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
420 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
421 if (pItem->GetGUID() == guid)
422 return pItem;
423
425 if (Bag* pBag = GetBagByPos(i))
426 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
427 if (Item* pItem = pBag->GetItemByPos(j))
428 if (pItem->GetGUID() == guid)
429 return pItem;
430
432 if (Bag* pBag = GetBagByPos(i))
433 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
434 if (Item* pItem = pBag->GetItemByPos(j))
435 if (pItem->GetGUID() == guid)
436 return pItem;
437
438 return nullptr;
439}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by _SaveInventory(), Spell::CheckCast(), WorldSession::DoLootRelease(), TradeData::GetItem(), TradeData::GetSpellCastItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleAutostoreLootItemOpcode(), debug_commandscript::HandleDebugGetItemValueCommand(), debug_commandscript::HandleDebugItemExpireCommand(), debug_commandscript::HandleDebugSetItemValueCommand(), Unit::HandleDummyAuraProc(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleItemRefund(), WorldSession::HandleItemRefundInfoRequest(), WorldSession::HandleItemTextQuery(), WorldSession::HandleLootMoneyOpcode(), Unit::HandleOverrideClassScriptAuraProc(), WorldSession::HandlePetitionRenameOpcode(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), SendLoot(), SpellCastTargets::Update(), and Spell::UpdatePointers().

◆ GetItemByPos() [1/2]

Item * Player::GetItemByPos ( uint16  pos) const
442{
443 uint8 bag = pos >> 8;
444 uint8 slot = pos & 255;
445 return GetItemByPos(bag, slot);
446}

References GetItemByPos().

Referenced by _SaveCharacter(), _SaveInventory(), _StoreItem(), AutoUnequipOffhandIfNeed(), BuildEnchantmentsInfoData(), CanEquipItem(), CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanStoreItems(), CanUnequipItem(), CanUnequipItems(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Create(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyZoneLimitedItem(), DurabilityLossAll(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), DurabilityRepair(), Spell::EffectDurabilityDamage(), Spell::EffectDurabilityDamagePCT(), Spell::EffectEnchantHeldItem(), EnchantmentFitsRequirements(), EquipItem(), EquippedOk(), FindEquipSlot(), GetBagByPos(), GetFreeInventorySpace(), GetItemByEntry(), GetItemByGuid(), GetItemByPos(), GetItemCount(), GetItemCountWithLimitCategory(), GetShield(), GetUseableItemByPos(), GetWeaponForAttack(), misc_commandscript::HandleAddItemCommand(), spell_rog_deadly_poison::HandleAfterHit(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModShapeshift(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), bg_commandscript::HandleBagsClearCommand(), WorldSession::HandleCancelTempEnchantmentOpcode(), character_commandscript::HandleCharacterCheckBagCommand(), debug_commandscript::HandleDebugGetItemStateCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetSave(), WorldSession::HandleEquipmentSetUse(), inventory_commandscript::HandleInventoryCountCommand(), WorldSession::HandleMirrorImageDataRequest(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleReadItem(), WorldSession::HandleSetTradeItemOpcode(), WorldSession::HandleWrapItemOpcode(), HasItemCount(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), HasItemTotemCategory(), IsTwoHandUsed(), MoveItemFromInventory(), RemoveArenaEnchantments(), RemoveItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), SplitItem(), SwapItem(), and ToggleMetaGemsActive().

◆ GetItemByPos() [2/2]

Item * Player::GetItemByPos ( uint8  bag,
uint8  slot 
) const
449{
450 if (bag == INVENTORY_SLOT_BAG_0 && (slot < BANK_SLOT_BAG_END || (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END)))
451 return m_items[slot];
452 else if (Bag* pBag = GetBagByPos(bag))
453 return pBag->GetItemByPos(slot);
454 return nullptr;
455}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, KEYRING_SLOT_START, and m_items.

◆ GetItemCount()

uint32 Player::GetItemCount ( uint32  item,
bool  inBankAlso = false,
Item skipItem = nullptr 
) const
328{
329 uint32 count = 0;
331 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
332 if (pItem != skipItem && pItem->GetEntry() == item)
333 count += pItem->GetCount();
334
336 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
337 if (pItem != skipItem && pItem->GetEntry() == item)
338 count += pItem->GetCount();
339
341 if (Bag* pBag = GetBagByPos(i))
342 count += pBag->GetItemCount(item, skipItem);
343
344 if (skipItem && skipItem->GetTemplate()->GemProperties)
346 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
347 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
348 count += pItem->GetGemCountWithID(item);
349
350 if (inBankAlso)
351 {
352 // checking every item from 39 to 74 (including bank bags)
354 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
355 if (pItem != skipItem && pItem->GetEntry() == item)
356 count += pItem->GetCount();
357
359 if (Bag* pBag = GetBagByPos(i))
360 count += pBag->GetItemCount(item, skipItem);
361
362 if (skipItem && skipItem->GetTemplate()->GemProperties)
364 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
365 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
366 count += pItem->GetGemCountWithID(item);
367 }
368
369 return count;
370}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, _Socket::Color, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, KEYRING_SLOT_START, and ItemTemplate::Socket.

Referenced by AdjustQuestReqItemCount(), CanRewardQuest(), CanRollOnItem(), CanTakeMoreSimilarItems(), WorldSession::HandleSetAmmoOpcode(), HasQuestForItem(), npc_venomhide_hatchling::npc_venomhide_hatchlingAI::IsSummonedBy(), ItemRemovedQuestCheck(), npc_adventurous_dwarf::OnGossipHello(), SendNewItem(), and PlayerMenu::SendQuestGiverRequestItems().

◆ GetItemCountWithLimitCategory()

uint32 Player::GetItemCountWithLimitCategory ( uint32  limitCategory,
Item skipItem = nullptr 
) const
373{
374 uint32 count = 0;
375 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i)
376 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
377 if (pItem != skipItem)
378 if (ItemTemplate const* pProto = pItem->GetTemplate())
379 if (pProto->ItemLimitCategory == limitCategory)
380 count += pItem->GetCount();
381
382 for (int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
383 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
384 if (pItem != skipItem)
385 if (ItemTemplate const* pProto = pItem->GetTemplate())
386 if (pProto->ItemLimitCategory == limitCategory)
387 count += pItem->GetCount();
388
390 if (Bag* pBag = GetBagByPos(i))
391 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
392
393 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
394 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
395 if (pItem != skipItem)
396 if (ItemTemplate const* pProto = pItem->GetTemplate())
397 if (pProto->ItemLimitCategory == limitCategory)
398 count += pItem->GetCount();
399
400 for (int i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
401 if (Bag* pBag = GetBagByPos(i))
402 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
403
404 return count;
405}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by CanTakeMoreSimilarItems().

◆ GetItemFromBuyBackSlot()

Item * Player::GetItemFromBuyBackSlot ( uint32  slot)
3988{
3989 LOG_DEBUG("entities.player.items", "STORAGE: GetItemFromBuyBackSlot slot = {}", slot);
3990 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
3991 return m_items[slot];
3992 return nullptr;
3993}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, LOG_DEBUG, and m_items.

Referenced by WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ GetItemUpdateQueue()

std::vector< Item * > & Player::GetItemUpdateQueue ( )
inline

◆ GetLastPetNumber()

uint32 Player::GetLastPetNumber ( ) const
inline
2467{ return m_lastpetnumber; }

References m_lastpetnumber.

Referenced by spell_gen_pet_summoned::HandleScript().

◆ GetLastPetSpell()

uint32 Player::GetLastPetSpell ( ) const
inline

◆ GetLastPotionId()

uint32 Player::GetLastPotionId ( )
inline
1820{ return m_lastPotionId; }

References m_lastPotionId.

Referenced by Spell::CheckCast(), and UpdatePotionCooldown().

◆ GetLastUsedRune()

RuneType Player::GetLastUsedRune ( )
inline
2522{ return m_runes->lastUsedRune; }
RuneType lastUsedRune
Definition: Player.h:435

References Runes::lastUsedRune, and m_runes.

◆ GetLevelPlayedTime()

uint32 Player::GetLevelPlayedTime ( )
inline

◆ GetLootGUID()

◆ GetMail()

Mail * Player::GetMail ( uint32  id)
3806{
3807 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
3808 {
3809 if ((*itr)->messageID == id)
3810 {
3811 return (*itr);
3812 }
3813 }
3814 return nullptr;
3815}

References m_mail.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailMarkAsRead(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), and WorldSession::HandleMailTakeMoney().

◆ GetMails()

PlayerMails const & Player::GetMails ( ) const
inline

◆ GetMailSize()

uint32 Player::GetMailSize ( )
inline
1658{ return m_mail.size();}

References m_mail.

Referenced by _SaveMail(), and WorldSession::HandleSendMail().

◆ GetManaBonusFromIntellect()

float Player::GetManaBonusFromIntellect ( )
287{
288 float intellect = GetStat(STAT_INTELLECT);
289
290 float baseInt = intellect < 20 ? intellect : 20;
291 float moreInt = intellect - baseInt;
292
293 return baseInt + (moreInt * 15.0f);
294}

References Unit::GetStat(), and STAT_INTELLECT.

Referenced by UpdateMaxPower().

◆ GetMapRef()

MapReference & Player::GetMapRef ( )
inline
2501{ return m_mapRef; }
MapReference m_mapRef
Definition: Player.h:2963

References m_mapRef.

Referenced by InstanceMap::CannotEnter(), BattlegroundMap::CannotEnter(), ResetMap(), and Map::UpdateIteratorBack().

◆ GetMaxKeyringSize()

uint32 Player::GetMaxKeyringSize ( ) const
inline

◆ GetMaxPersonalArenaRatingRequirement()

uint32 Player::GetMaxPersonalArenaRatingRequirement ( uint32  minarenaslot) const

If trans is specified, arena point save query will be added to trans.

10836{
10837 // returns the maximal personal arena rating that can be used to purchase items requiring this condition
10838 // the personal rating of the arena team must match the required limit as well
10839 // so return max[in arenateams](min(personalrating[teamtype], teamrating[teamtype]))
10840 uint32 max_personal_rating = 0;
10841 for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
10842 {
10843 if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
10844 {
10845 uint32 p_rating = GetArenaPersonalRating(i);
10846 uint32 t_rating = at->GetRating();
10847 p_rating = p_rating < t_rating ? p_rating : t_rating;
10848 if (max_personal_rating < p_rating)
10849 max_personal_rating = p_rating;
10850 }
10851 }
10852
10853 sScriptMgr->OnPlayerGetMaxPersonalArenaRatingRequirement(this, minarenaslot, max_personal_rating);
10854
10855 return max_personal_rating;
10856}
uint32 GetArenaPersonalRating(uint8 slot) const
Definition: Player.cpp:16143
uint32 GetArenaTeamId(uint8 slot) const
Definition: Player.cpp:16152

References GetArenaPersonalRating(), GetArenaTeamId(), MAX_ARENA_SLOT, sArenaTeamMgr, and sScriptMgr.

Referenced by BuyItemFromVendorSlot().

◆ GetMaxSkillValue()

uint16 Player::GetMaxSkillValue ( uint32  skill) const
5476{
5477 if (!skill)
5478 return 0;
5479
5480 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5481 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5482 return 0;
5483
5484 uint32 bonus = GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos));
5485
5486 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5487 sScriptMgr->OnPlayerGetMaxSkillValue(const_cast<Player*>(this), skill, result, false);
5488 result += SKILL_TEMP_BONUS(bonus);
5489 result += SKILL_PERM_BONUS(bonus);
5490 return result < 0 ? 0 : result;
5491}
#define SKILL_TEMP_BONUS(x)
Definition: Player.h:86

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, SKILL_PERM_BONUS, SKILL_TEMP_BONUS, and sScriptMgr.

Referenced by Unit::GetDefenseSkillValue(), and UpdateFishingSkill().

◆ GetMaxSkillValueForLevel()

uint16 Player::GetMaxSkillValueForLevel ( ) const
16180{
16182
16183 sScriptMgr->OnPlayerGetMaxSkillValueForLevel(const_cast<Player*>(this), result);
16184
16185 return result;
16186}
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:1130

References Unit::GetMaxSkillValueForLevel(), and sScriptMgr.

Referenced by _addSpell(), _LoadSkills(), GetMissPercentageFromDefence(), LearnDefaultSkill(), removeSpell(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDodgePercentage(), UpdateParryPercentage(), and UpdateSkillsForLevel().

◆ getMaxTimer()

int32 Player::getMaxTimer ( MirrorTimerType  timer)
protected
814{
815 switch (timer)
816 {
817 case FATIGUE_TIMER:
818 return MINUTE * IN_MILLISECONDS;
819 case BREATH_TIMER:
820 {
823 int32 UnderWaterTime = sWorld->getIntConfig(CONFIG_WATER_BREATH_TIMER);
825 for (AuraEffectList::const_iterator i = mModWaterBreathing.begin(); i != mModWaterBreathing.end(); ++i)
826 AddPct(UnderWaterTime, (*i)->GetAmount());
827 return UnderWaterTime;
828 }
829 case FIRE_TIMER:
830 {
831 if (!IsAlive())
833 return 2020;
834 }
835 default:
836 return 0;
837 }
838}
@ FIRE_TIMER
Definition: Player.h:582
@ FATIGUE_TIMER
Definition: Player.h:580
@ BREATH_TIMER
Definition: Player.h:581
@ SPELL_AURA_MOD_WATER_BREATHING
Definition: SpellAuraDefines.h:218
@ CONFIG_WATER_BREATH_TIMER
Definition: IWorld.h:423
@ CONFIG_DISABLE_BREATHING
Definition: IWorld.h:307
AccountTypes
Definition: Common.h:56
bool HasWaterBreathingAura() const
Definition: Unit.h:1716

References AddPct(), BREATH_TIMER, CONFIG_DISABLE_BREATHING, CONFIG_WATER_BREATH_TIMER, DISABLED_MIRROR_TIMER, FATIGUE_TIMER, FIRE_TIMER, Unit::GetAuraEffectsByType(), GetSession(), Unit::HasWaterBreathingAura(), IN_MILLISECONDS, Unit::IsAlive(), MINUTE, SPELL_AURA_MOD_WATER_BREATHING, and sWorld.

Referenced by HandleDrowning(), and IsMirrorTimerActive().

◆ GetMeleeCritFromAgility()

float Player::GetMeleeCritFromAgility ( )
5104{
5105 uint8 level = GetLevel();
5106 uint32 pclass = getClass();
5107
5108 if (level > GT_MAX_LEVEL)
5109 level = GT_MAX_LEVEL;
5110
5111 GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.LookupEntry(pclass - 1);
5112 GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5113 if (!critBase || !critRatio)
5114 return 0.0f;
5115
5116 float crit = critBase->base + GetStat(STAT_AGILITY) * critRatio->ratio;
5117 return crit * 100.0f;
5118}
DBCStorage< GtChanceToMeleeCritBaseEntry > sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt)
Definition: DBCStructure.h:1053
float base
Definition: DBCStructure.h:1054

References GtChanceToMeleeCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritBaseStore, sGtChanceToMeleeCritStore, and STAT_AGILITY.

Referenced by UpdateAllCritPercentages().

◆ GetMeleeDamageSchoolMask()

SpellSchoolMask Player::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
overridevirtual

Implements Unit.

7006{
7007 if (Item const* weapon = GetWeaponForAttack(attackType, true))
7008 {
7009 return SpellSchoolMask(1 << weapon->GetTemplate()->Damage[damageIndex].DamageType);
7010 }
7011
7013}
SpellSchoolMask
Definition: SharedDefines.h:295

References GetWeaponForAttack(), and SPELL_SCHOOL_MASK_NORMAL.

◆ GetMissPercentageFromDefence()

float Player::GetMissPercentageFromDefence ( ) const
709{
710 float const miss_cap[MAX_CLASSES] =
711 {
712 16.00f, // Warrior //correct
713 16.00f, // Paladin //correct
714 16.00f, // Hunter //?
715 16.00f, // Rogue //?
716 16.00f, // Priest //?
717 16.00f, // DK //correct
718 16.00f, // Shaman //?
719 16.00f, // Mage //?
720 16.00f, // Warlock //?
721 0.0f, // ??
722 16.00f // Druid //?
723 };
724
725 float diminishing = 0.0f, nondiminishing = 0.0f;
726 // Modify value from defense skill (only bonus from defense rating diminishes)
727 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
728 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
729
730 // apply diminishing formula to diminishing miss chance
731 uint32 pclass = getClass() - 1;
732 return nondiminishing + (diminishing * miss_cap[pclass] / (diminishing + miss_cap[pclass] * m_diminishing_k[pclass]));
733}
const float m_diminishing_k[MAX_CLASSES]
Definition: StatSystem.cpp:693
float GetRatingBonusValue(CombatRating cr) const
Definition: Player.cpp:5206

References CR_DEFENSE_SKILL, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), m_diminishing_k, MAX_CLASSES, and SKILL_DEFENSE.

◆ GetMItem()

Item * Player::GetMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1677 {
1678 ItemMap::const_iterator itr = mMitems.find(itemLowGuid);
1679 return itr != mMitems.end() ? itr->second : nullptr;
1680 }

References mMitems.

Referenced by WorldSession::HandleGetMailList(), WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ GetMoney()

◆ GetMostPointsTalentTree()

uint8 Player::GetMostPointsTalentTree ( ) const
15245{
15246 uint32 specPoints[3] = {0, 0, 0};
15247 const PlayerTalentMap& talentMap = GetTalentMap();
15248 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15249 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15250 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15251 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15252 if (tab->tabpage < 3)
15253 {
15254 // find current talent rank
15255 uint8 currentTalentRank = 0;
15256 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15257 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15258 {
15259 currentTalentRank = rank + 1;
15260 break;
15261 }
15262 specPoints[tab->tabpage] += currentTalentRank;
15263 }
15264 uint8 maxIndex = 0;
15265 uint8 maxCount = specPoints[0];
15266 for (uint8 i = 1; i < 3; ++i)
15267 if (specPoints[i] > maxCount)
15268 {
15269 maxIndex = i;
15270 maxCount = specPoints[i];
15271 }
15272 return maxIndex;
15273}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

◆ GetMountBlockId()

uint32 Player::GetMountBlockId ( )
inline

◆ GetNextQuest()

Quest const * Player::GetNextQuest ( ObjectGuid  guid,
Quest const *  quest 
)
208{
209 QuestRelationBounds objectQR;
210
212 if (creature)
213 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
214 else
215 {
216 //we should obtain map pointer from GetMap() in 99% of cases. Special case
217 //only for quests which cast teleport spells on player
219 ASSERT(_map);
220 GameObject* pGameObject = _map->GetGameObject(guid);
221 if (pGameObject)
222 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
223 else
224 return nullptr;
225 }
226
227 uint32 nextQuestID = quest->GetNextQuestInChain();
228 for (QuestRelations::const_iterator itr = objectQR.first; itr != objectQR.second; ++itr)
229 {
230 if (itr->second == nextQuestID)
231 return sObjectMgr->GetQuestTemplate(nextQuestID);
232 }
233
234 return nullptr;
235}
std::pair< QuestRelations::const_iterator, QuestRelations::const_iterator > QuestRelationBounds
Definition: ObjectMgr.h:525
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition: ObjectAccessor.cpp:234

References ASSERT, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), Quest::GetNextQuestInChain(), Object::IsInWorld(), sMapMgr, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ GetNextRandomRaidMember()

Player * Player::GetNextRandomRaidMember ( float  radius)
12930{
12931 Group* group = GetGroup();
12932 if (!group)
12933 return nullptr;
12934
12935 std::vector<Player*> nearMembers;
12936 nearMembers.reserve(group->GetMembersCount());
12937
12938 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12939 {
12940 Player* Target = itr->GetSource();
12941
12942 // IsHostileTo check duel and controlled by enemy
12943 if (Target && Target != this && IsWithinDistInMap(Target, radius) &&
12944 !Target->HasInvisibilityAura() && !IsHostileTo(Target))
12945 nearMembers.push_back(Target);
12946 }
12947
12948 if (nearMembers.empty())
12949 return nullptr;
12950
12951 uint32 randTarget = urand(0, nearMembers.size() - 1);
12952 return nearMembers[randTarget];
12953}
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10276

References Group::GetFirstMember(), GetGroup(), Group::GetMembersCount(), Unit::HasInvisibilityAura(), Unit::IsHostileTo(), WorldObject::IsWithinDistInMap(), GroupReference::next(), and urand().

◆ GetNextSave()

uint32 Player::GetNextSave ( ) const
inline
2621{ return m_nextSave; }

References m_nextSave.

◆ GetNPCIfCanInteractWith()

Creature * Player::GetNPCIfCanInteractWith ( ObjectGuid  guid,
uint32  npcflagmask 
)
2084{
2085 // unit checks
2086 if (!guid)
2087 return nullptr;
2088
2089 if (!IsInWorld())
2090 return nullptr;
2091
2092 if (IsInFlight())
2093 return nullptr;
2094
2095 // exist (we need look pets also for some interaction (quest/etc)
2096 Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid);
2097 if (!creature)
2098 return nullptr;
2099
2100 // Deathstate checks
2102 return nullptr;
2103
2104 // alive or spirit healer
2106 return nullptr;
2107
2108 // appropriate npc type
2109 if (npcflagmask && !creature->HasNpcFlag(NPCFlags(npcflagmask)))
2110 return nullptr;
2111
2112 // not allow interaction under control, but allow with own pets
2113 if (creature->GetCharmerGUID())
2114 return nullptr;
2115
2116 // xinef: perform better check
2117 if (creature->GetReactionTo(this) <= REP_UNFRIENDLY)
2118 return nullptr;
2119
2120 // xinef: not needed, CORRECTLY checked above including forced reputations etc
2121 // not unfriendly
2122 //if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(creature->GetFaction()))
2123 // if (factionTemplate->faction)
2124 // if (FactionEntry const* faction = sFactionStore.LookupEntry(factionTemplate->faction))
2125 // if (faction->reputationListID >= 0 && GetReputationMgr().GetRank(faction) <= REP_UNFRIENDLY)
2126 // return nullptr;
2127
2128 // not too far
2129 if (!creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
2130 return nullptr;
2131
2132 // pussywizard: many npcs have missing conditions for class training and rogue trainer can for eg. train dual wield to a shaman :/ too many to change in sql and watch in the future
2133 // pussywizard: this function is not used when talking, but when already taking action (buy spell, reset talents, show spell list)
2135 return nullptr;
2136
2137 return creature;
2138}
#define INTERACTION_DISTANCE
Definition: ObjectDefines.h:24
@ CLASS_CONTEXT_CLASS_TRAINER
Definition: UnitDefines.h:243
NPCFlags
Non Player Character flags.
Definition: UnitDefines.h:313
@ UNIT_NPC_FLAG_TRAINER_CLASS
Definition: UnitDefines.h:320
@ UNIT_NPC_FLAG_TRAINER
Definition: UnitDefines.h:319
Classes
Definition: SharedDefines.h:139
@ REP_UNFRIENDLY
Definition: SharedDefines.h:182
@ TRAINER_TYPE_CLASS
Definition: SharedDefines.h:2617
@ CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS
Definition: SharedDefines.h:2696
@ CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD
Definition: SharedDefines.h:2702
uint32 trainer_class
Definition: CreatureData.h:220
uint32 type_flags
Definition: CreatureData.h:223
uint32 trainer_type
Definition: CreatureData.h:218
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:10104
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:718
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:674

References CLASS_CONTEXT_CLASS_TRAINER, CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD, CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS, Unit::GetCharmerGUID(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Creature::GetCreatureTemplate(), Unit::GetReactionTo(), Unit::HasNpcFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), IsClass(), Unit::IsInFlight(), Object::IsInWorld(), WorldObject::IsWithinDistInMap(), REP_UNFRIENDLY, CreatureTemplate::trainer_class, CreatureTemplate::trainer_type, TRAINER_TYPE_CLASS, CreatureTemplate::type_flags, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_TRAINER_CLASS.

Referenced by BuyItemFromVendorSlot(), CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), WorldSession::CanUseBank(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::SendListInventory(), WorldSession::SendPetitionShowList(), and WorldSession::SendTrainerList().

◆ GetOriginalGroup()

◆ GetOriginalGroupRef()

GroupReference & Player::GetOriginalGroupRef ( )
inline
2494{ return m_originalGroup; }

References m_originalGroup.

◆ GetOriginalSubGroup()

uint8 Player::GetOriginalSubGroup ( ) const
inline
2495{ return m_originalGroup.getSubGroup(); }
uint8 getSubGroup() const
Definition: GroupReference.h:38

References GroupReference::getSubGroup(), and m_originalGroup.

Referenced by RemoveFromBattlegroundOrBattlefieldRaid().

◆ GetOrInitPetStable()

PetStable & Player::GetOrInitPetStable ( )
15525{
15526 if (!m_petStable)
15527 m_petStable = std::make_unique<PetStable>();
15528
15529 return *m_petStable;
15530}

References m_petStable.

Referenced by WorldSession::HandleBuyStableSlot(), Unit::InitTamedPet(), and SummonPet().

◆ GetOutdoorPvP()

OutdoorPvP * Player::GetOutdoorPvP ( ) const
12462{
12463 return sOutdoorPvPMgr->GetOutdoorPvPToZoneId(GetZoneId());
12464}
#define sOutdoorPvPMgr
Definition: OutdoorPvPMgr.h:102

References WorldObject::GetZoneId(), and sOutdoorPvPMgr.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Unit::Kill().

◆ GetPassOnGroupLoot()

bool Player::GetPassOnGroupLoot ( ) const
inline
2499{ return m_bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by Group::GroupLoot(), and Group::NeedBeforeGreed().

◆ GetPendingBind()

uint32 Player::GetPendingBind ( ) const
inline
2450{ return _pendingBindId; }

References _pendingBindId.

Referenced by WorldSession::HandleInstanceLockResponse().

◆ GetPendingSpectatorInviteInstanceId()

uint32 Player::GetPendingSpectatorInviteInstanceId ( ) const
inline

◆ GetPet()

Pet * Player::GetPet ( ) const
8920{
8921 if (ObjectGuid pet_guid = GetPetGUID())
8922 {
8923 if (!pet_guid.IsPet())
8924 return nullptr;
8925
8926 Pet* pet = ObjectAccessor::GetPet(*this, pet_guid);
8927
8928 if (!pet)
8929 return nullptr;
8930
8931 if (IsInWorld())
8932 return pet;
8933
8934 //there may be a guardian in slot
8935 //LOG_ERROR("entities.player", "Player::GetPet: Pet {} not exist.", pet_guid.ToString());
8936 //const_cast<Player*>(this)->SetPetGUID(0);
8937 }
8938
8939 return nullptr;
8940}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:215

References ObjectAccessor::GetPet(), Unit::GetPetGUID(), and Object::IsInWorld().

Referenced by Spell::_cast(), KillRewarder::_RewardXP(), ActivateSpec(), Battleground::AddPlayer(), AuraEffect::ApplySpellMod(), WorldSession::BuildPartyMemberStatsChangedPacket(), BuildPetTalentsInfoData(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), Unit::DealDamage(), spell_hun_masters_call::DoCheckCast(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::EffectFeedPet(), Spell::EffectResurrectPet(), Spell::EffectSummonPet(), GiveLevel(), AuraEffect::HandleAuraModPetTalentsPoints(), spell_hun_masters_call::HandleDummy(), learn_commandscript::HandleLearnAllMyPetTalentsCommand(), AuraEffect::HandleModPossessPet(), WorldSession::HandleMoveTeleportAck(), pet_commandscript::HandlePetLearnCommand(), pet_commandscript::HandlePetUnlearnCommand(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRequestPartyMemberStatsOpcode(), WorldSession::HandleRequestPetInfo(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), InitStatsForLevel(), Unit::Kill(), LearnPetTalent(), Pet::LoadPetFromDB(), go_orb_of_domination::OnGossipHello(), PetSpellInitialize(), PrepareGossipMenu(), RemoveArenaSpellCooldowns(), RemovePet(), ResetPetTalents(), SaveToDB(), SendUpdateToOutOfRangeGroupMembers(), SetGameMaster(), Unit::SetSpeed(), TeleportTo(), UnsummonPetTemporaryIfAny(), and Update().

◆ GetPetStable() [1/2]

◆ GetPetStable() [2/2]

PetStable const * Player::GetPetStable ( ) const
inline
1222{ return m_petStable.get(); }

References m_petStable.

◆ GetPhaseMaskForSpawn()

uint32 Player::GetPhaseMaskForSpawn ( ) const
13716{
13718
13719 if (!phase)
13721
13722 // some aura phases include 1 normal map in addition to phase itself
13723 uint32 n_phase = phase & ~PHASEMASK_NORMAL;
13724 if (n_phase > 0)
13725 return n_phase;
13726
13727 return phase;
13728}
@ PHASEMASK_NORMAL
Definition: Object.h:61
phase
Definition: boss_skadi.cpp:103
uint32 GetPhaseMask() const
Definition: Object.h:452
uint32 GetPhaseByAuras() const
Definition: Unit.cpp:19071

References Unit::GetPhaseByAuras(), WorldObject::GetPhaseMask(), IsGameMaster(), and PHASEMASK_NORMAL.

Referenced by gobject_commandscript::HandleGameObjectAddCommand(), npc_commandscript::HandleNpcAddCommand(), wp_commandscript::HandleWpModifyCommand(), and wp_commandscript::HandleWpShowCommand().

◆ GetPlayerFlags()

PlayerFlags Player::GetPlayerFlags ( ) const
inline
@ PLAYER_FLAGS
Definition: UpdateFields.h:178
PlayerFlags
Definition: Player.h:479

References Object::GetUInt32Value(), and PLAYER_FLAGS.

Referenced by _SaveCharacter().

◆ GetPlayerName()

std::string Player::GetPlayerName ( )
16238{
16239 std::string name = GetName();
16240 std::string color = "";
16241
16242 switch (getClass())
16243 {
16244 case CLASS_DEATH_KNIGHT: color = "|cffC41F3B"; break;
16245 case CLASS_DRUID: color = "|cffFF7D0A"; break;
16246 case CLASS_HUNTER: color = "|cffABD473"; break;
16247 case CLASS_MAGE: color = "|cff69CCF0"; break;
16248 case CLASS_PALADIN: color = "|cffF58CBA"; break;
16249 case CLASS_PRIEST: color = "|cffFFFFFF"; break;
16250 case CLASS_ROGUE: color = "|cffFFF569"; break;
16251 case CLASS_SHAMAN: color = "|cff0070DE"; break;
16252 case CLASS_WARLOCK: color = "|cff9482C9"; break;
16253 case CLASS_WARRIOR: color = "|cffC79C6E"; break;
16254 }
16255
16256 return "|Hplayer:" + name + "|h" + color + name + "|h|r";
16257}
@ CLASS_PRIEST
Definition: SharedDefines.h:145

References CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, Unit::getClass(), and WorldObject::GetName().

Referenced by gear_commandscript::HandleGearStatsCommand().

◆ GetPlayerSetting()

PlayerSetting Player::GetPlayerSetting ( std::string  source,
uint8  index 
)
71{
72 auto itr = m_charSettingsMap.find(source);
73
74 if (itr == m_charSettingsMap.end())
75 {
76 // Settings not found, this will initialize a new entry.
77 UpdatePlayerSetting(source, index, 0);
78 return GetPlayerSetting(source, index);
79 }
80
81 PlayerSettingVector settingVector = itr->second;
82 if (settingVector.size() < (uint8)(index + 1))
83 {
84 UpdatePlayerSetting(source, index, 0);
85 return GetPlayerSetting(source, index);
86 }
87
88 return itr->second[index];
89}
void UpdatePlayerSetting(std::string source, uint8 index, uint32 value)
Definition: PlayerSettings.cpp:115
PlayerSetting GetPlayerSetting(std::string source, uint8 index)
Definition: PlayerSettings.cpp:70

References GetPlayerSetting(), m_charSettingsMap, and UpdatePlayerSetting().

Referenced by GetPlayerSetting(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), and ChatHandler::SendWorldTextOptional().

◆ GetPureMaxSkillValue()

uint16 Player::GetPureMaxSkillValue ( uint32  skill) const
5494{
5495 if (!skill)
5496 return 0;
5497
5498 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5499 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5500 return 0;
5501
5502 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5503
5504 sScriptMgr->OnPlayerGetMaxSkillValue(const_cast<Player*>(this), skill, result, true);
5505
5506 return result < 0 ? 0 : result;
5507}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, and sScriptMgr.

Referenced by _addSpell(), learn_commandscript::HandleLearnAllRecipesCommand(), lookup_commandscript::HandleLookupSkillCommand(), misc_commandscript::HandleSetSkillCommand(), and removeSpell().

◆ GetPureSkillValue()

uint16 Player::GetPureSkillValue ( uint32  skill) const

◆ GetQuestDialogStatus()

QuestGiverStatus Player::GetQuestDialogStatus ( Object questGiver)
1596{
1599
1600 sScriptMgr->GetDialogStatus(this, questgiver);
1601
1602 switch (questgiver->GetTypeId())
1603 {
1604 case TYPEID_GAMEOBJECT:
1605 {
1606 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject()));
1607 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1608 return questStatus;
1609 qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry());
1610 qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry());
1611 break;
1612 }
1613 case TYPEID_UNIT:
1614 {
1615 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature()));
1616 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1617 return questStatus;
1618 qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry());
1619 qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry());
1620 break;
1621 }
1622 default:
1623 // it's impossible, but check
1624 //LOG_ERROR("entities.player.quest", "GetQuestDialogStatus called for unexpected type {}", questgiver->GetTypeId());
1625 return DIALOG_STATUS_NONE;
1626 }
1627
1629
1630 for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i)
1631 {
1633 uint32 questId = i->second;
1634 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1635 if (!quest)
1636 continue;
1637
1638 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1639 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1640 continue;
1641
1642 QuestStatus status = GetQuestStatus(questId);
1643 if (status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(questId))
1644 {
1645 result2 = DIALOG_STATUS_REWARD;
1646 }
1647 else if (status == QUEST_STATUS_INCOMPLETE)
1648 {
1649 result2 = DIALOG_STATUS_INCOMPLETE;
1650 }
1651
1652 if (quest->IsAutoComplete() && CanTakeQuest(quest, false) && quest->IsRepeatable() && !quest->IsDailyOrWeekly())
1653 {
1654 result2 = DIALOG_STATUS_REWARD_REP;
1655 }
1656
1657 if (result2 > result)
1658 {
1659 result = result2;
1660 }
1661 }
1662
1663 for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i)
1664 {
1666 uint32 questId = i->second;
1667 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1668 if (!quest)
1669 continue;
1670
1671 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1672 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1673 continue;
1674
1675 QuestStatus status = GetQuestStatus(questId);
1676 if (status == QUEST_STATUS_NONE)
1677 {
1678 if (CanSeeStartQuest(quest))
1679 {
1680 if (SatisfyQuestLevel(quest, false))
1681 {
1682 bool isNotLowLevelQuest = GetLevel() <= (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF));
1683
1684 if (quest->IsRepeatable())
1685 {
1686 if (quest->IsDaily())
1687 {
1688 if (isNotLowLevelQuest)
1689 {
1691 }
1692 else
1693 {
1695 }
1696 }
1697 else if (quest->IsWeekly() || quest->IsMonthly())
1698 {
1699 if (isNotLowLevelQuest)
1700 {
1701 result2 = DIALOG_STATUS_AVAILABLE;
1702 }
1703 else
1704 {
1706 }
1707 }
1708 else if (quest->IsAutoComplete())
1709 {
1710 if (isNotLowLevelQuest)
1711 {
1712 result2 = DIALOG_STATUS_REWARD_REP;
1713 }
1714 else
1715 {
1717 }
1718 }
1719 else
1720 {
1721 if (isNotLowLevelQuest)
1722 {
1723 result2 = DIALOG_STATUS_REWARD_REP;
1724 }
1725 else
1726 {
1728 }
1729 }
1730 }
1731 else
1732 {
1733 result2 = isNotLowLevelQuest ? DIALOG_STATUS_AVAILABLE : DIALOG_STATUS_LOW_LEVEL_AVAILABLE;
1734 }
1735 }
1736 else
1737 {
1738 result2 = DIALOG_STATUS_UNAVAILABLE;
1739 }
1740 }
1741 }
1742
1743 if (result2 > result)
1744 result = result2;
1745 }
1746
1747 return result;
1748}
@ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF
Definition: IWorld.h:287
@ CONDITION_SOURCE_TYPE_QUEST_AVAILABLE
Definition: ConditionMgr.h:142
QuestGiverStatus
Definition: QuestDef.h:111
@ DIALOG_STATUS_UNAVAILABLE
Definition: QuestDef.h:113
@ DIALOG_STATUS_NONE
Definition: QuestDef.h:112
@ DIALOG_STATUS_AVAILABLE
Definition: QuestDef.h:120
@ DIALOG_STATUS_SCRIPTED_NO_STATUS
Definition: QuestDef.h:125
@ DIALOG_STATUS_LOW_LEVEL_REWARD_REP
Definition: QuestDef.h:115
@ DIALOG_STATUS_REWARD
Definition: QuestDef.h:122
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE
Definition: QuestDef.h:114
@ DIALOG_STATUS_REWARD_REP
Definition: QuestDef.h:118
@ DIALOG_STATUS_INCOMPLETE
Definition: QuestDef.h:117
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP
Definition: QuestDef.h:116
@ DIALOG_STATUS_AVAILABLE_REP
Definition: QuestDef.h:119
int32 GetQuestLevel(Quest const *quest) const
Definition: Player.h:1435
bool CanSeeStartQuest(Quest const *quest)
Definition: PlayerQuest.cpp:237
uint32 GetQuestId() const
Definition: QuestDef.h:228
bool IsDaily() const
Definition: QuestDef.h:287
bool IsWeekly() const
Definition: QuestDef.h:288
bool IsDailyOrWeekly() const
Definition: QuestDef.h:291
bool IsMonthly() const
Definition: QuestDef.h:289

References CanSeeStartQuest(), CanTakeQuest(), CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF, DIALOG_STATUS_AVAILABLE, DIALOG_STATUS_AVAILABLE_REP, DIALOG_STATUS_INCOMPLETE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP, DIALOG_STATUS_LOW_LEVEL_REWARD_REP, DIALOG_STATUS_NONE, DIALOG_STATUS_REWARD, DIALOG_STATUS_REWARD_REP, DIALOG_STATUS_SCRIPTED_NO_STATUS, DIALOG_STATUS_UNAVAILABLE, Object::GetEntry(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), GetQuestRewardStatus(), GetQuestStatus(), Object::GetTypeId(), Quest::IsAutoComplete(), Quest::IsDaily(), Quest::IsDailyOrWeekly(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SatisfyQuestLevel(), sConditionMgr, sObjectMgr, sScriptMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GameObject::ActivateToQuest(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), and SendQuestGiverStatusMultiple().

◆ GetQuestLevel()

int32 Player::GetQuestLevel ( Quest const *  quest) const
inline

◆ GetQuestRate()

float Player::GetQuestRate ( bool  isDFQuest = false)
16189{
16190 float result = isDFQuest ? sWorld->getRate(RATE_XP_QUEST_DF) : sWorld->getRate(RATE_XP_QUEST);
16191
16192 sScriptMgr->OnPlayerGetQuestRate(this, result);
16193
16194 return result;
16195}
@ RATE_XP_QUEST_DF
Definition: IWorld.h:482
@ RATE_XP_QUEST
Definition: IWorld.h:481

References RATE_XP_QUEST, RATE_XP_QUEST_DF, sScriptMgr, and sWorld.

Referenced by CalculateQuestRewardXP().

◆ GetQuestRewardStatus()

◆ GetQuestSlotCounter()

uint16 Player::GetQuestSlotCounter ( uint16  slot,
uint8  counter 
) const
inline
1497{ return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); }
@ PLAYER_QUEST_LOG_1_1
Definition: UpdateFields.h:186
@ QUEST_COUNTS_OFFSET
Definition: Player.h:630
#define MAX_QUEST_OFFSET
Definition: Player.h:634

References Object::GetUInt64Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and QUEST_COUNTS_OFFSET.

Referenced by SendQuestUpdateAddCreatureOrGo(), and SendQuestUpdateAddPlayer().

◆ GetQuestSlotQuestId()

◆ GetQuestSlotState()

uint32 Player::GetQuestSlotState ( uint16  slot) const
inline

◆ GetQuestSlotTime()

uint32 Player::GetQuestSlotTime ( uint16  slot) const
inline

◆ GetQuestStatus()

QuestStatus Player::GetQuestStatus ( uint32  quest_id) const
1431{
1432 if (quest_id)
1433 {
1434 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1435
1436 if (itr != m_QuestStatus.end())
1437 {
1438 return itr->second.Status;
1439 }
1440
1441 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id))
1442 {
1443 if (qInfo->IsSeasonal())
1444 {
1446 }
1447
1448 if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id))
1449 {
1450 return QUEST_STATUS_REWARDED;
1451 }
1452 }
1453 }
1454
1455 return QUEST_STATUS_NONE;
1456}
@ QUEST_STATUS_REWARDED
Definition: QuestDef.h:106

References IsQuestRewarded(), m_QuestStatus, QUEST_STATUS_NONE, QUEST_STATUS_REWARDED, SatisfyQuestSeasonal(), and sObjectMgr.

Referenced by GameObject::ActivateToQuest(), LootItem::AllowedForPlayer(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::AttackStart(), CanRewardQuest(), ServerMailCondition::CheckCondition(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), spell_item_demon_broiled_surprise::CheckRequirement(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), DuelComplete(), Spell::EffectQuestClear(), Spell::EffectScriptEffect(), SmartAI::EndPath(), FailQuest(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), go_gilded_brazier::go_gilded_brazierAI::GossipHello(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), WorldSession::HandleAreaTriggerOpcode(), spell_midsummer_torch_catch::HandleDummy(), spell_q12014_steady_as_a_rock::HandleFinish(), spell_sindragosa_frost_breath::HandleInfusion(), lookup_commandscript::HandleLookupQuestCommand(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverRequestRewardOpcode(), spell_q11322_q11317_the_cleansing::if(), SpellArea::IsFitToRequirements(), npc_kservant::npc_kservantAI::IsSummonedBy(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_alar::JustDied(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), npc_a_special_surprise::npc_a_special_surpriseAI::MeetQuestCondition(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), npc_black_knight_graveyard::npc_black_knight_graveyardAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_rizzle_sprysprocket::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_great_bear_spirit::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_plucky::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_iruk::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_tele_to_violet_stand::OnGossipHello(), go_ravager_cage::OnGossipHello(), go_bristlelimb_cage::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_skull_pile::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_table_theka::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_amberpine_outhouse::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_great_bear_spirit::OnGossipSelect(), at_ancient_leaf::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), at_malfurion_stormrage::OnTrigger(), at_commander_dawnforge::OnTrigger(), item_captured_frog::OnUse(), npc_doctor::npc_doctorAI::PatientDied(), npc_doctor::npc_doctorAI::PatientSaved(), PrepareQuestMenu(), NPCStaveQuestAI::QuestIncomplete(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), SatisfyQuestExclusiveGroup(), SatisfyQuestNextChain(), SatisfyQuestPreviousQuest(), SatisfyQuestStatus(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::SetBossState(), npc_costumed_orphan_matron::sGossipHello(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), Battleground::SpiritOfCompetitionEvent(), npc_clintar_spirit::npc_clintar_spiritAI::StartEvent(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), and GameObject::Use().

◆ getQuestStatusMap()

◆ GetQuestStatusSaveMap()

QuestStatusSaveMap & Player::GetQuestStatusSaveMap ( )
inline
1636{ return m_QuestStatusSave; }

References m_QuestStatusSave.

◆ GetRaidDifficulty()

◆ GetRandomWinner()

bool Player::GetRandomWinner ( )
inline

◆ GetRank()

uint8 Player::GetRank ( ) const
inline

◆ GetRatingBonusValue()

◆ GetRatingMultiplier()

float Player::GetRatingMultiplier ( CombatRating  cr) const
5191{
5192 uint8 level = GetLevel();
5193
5194 if (level > GT_MAX_LEVEL)
5195 level = GT_MAX_LEVEL;
5196
5197 GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr * GT_MAX_LEVEL + level - 1);
5198 // gtOCTClassCombatRatingScalarStore.dbc starts with 1, CombatRating with zero, so cr+1
5199 GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((getClass() - 1) * GT_MAX_RATING + cr + 1);
5200 if (!Rating || !classRating)
5201 return 1.0f; // By default use minimum coefficient (not must be called)
5202
5203 return classRating->ratio / Rating->ratio;
5204}
DBCStorage< GtCombatRatingsEntry > sGtCombatRatingsStore(GtCombatRatingsfmt)
DBCStorage< GtOCTClassCombatRatingScalarEntry > sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt)
#define GT_MAX_RATING
Definition: DBCStructure.h:1040
Definition: DBCStructure.h:1048
float ratio
Definition: DBCStructure.h:1049
Definition: DBCStructure.h:1078
float ratio
Definition: DBCStructure.h:1079

References Unit::getClass(), Unit::GetLevel(), GT_MAX_LEVEL, GT_MAX_RATING, GtCombatRatingsEntry::ratio, GtOCTClassCombatRatingScalarEntry::ratio, sGtCombatRatingsStore, and sGtOCTClassCombatRatingScalarStore.

Referenced by ApplyRatingMod(), and GetRatingBonusValue().

◆ GetRealDodge()

float Player::GetRealDodge ( ) const
inline
2618{ return m_realDodge; }

References m_realDodge.

Referenced by Unit::GetUnitDodgeChance().

◆ GetRealParry()

float Player::GetRealParry ( ) const
inline
2617{ return m_realParry; }

References m_realParry.

◆ GetReputation()

uint32 Player::GetReputation ( uint32  factionentry) const
15281{
15282 return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry));
15283}
int32 GetReputation(uint32 faction_id) const
Definition: ReputationMgr.cpp:78

References ReputationMgr::GetReputation(), GetReputationMgr(), and sFactionStore.

Referenced by CanCompleteQuest(), ReputationChanged(), ReputationChanged2(), and SatisfyQuestReputation().

◆ GetReputationMgr() [1/2]

◆ GetReputationMgr() [2/2]

ReputationMgr const & Player::GetReputationMgr ( ) const
inline
2136{ return *m_reputationMgr; }

References m_reputationMgr.

◆ GetReputationPriceDiscount() [1/2]

◆ GetReputationPriceDiscount() [2/2]

float Player::GetReputationPriceDiscount ( FactionTemplateEntry const *  factionTemplate) const
12290{
12291 if (!factionTemplate || !factionTemplate->faction)
12292 {
12293 return 1.0f;
12294 }
12295
12296 ReputationRank rank = GetReputationRank(factionTemplate->faction);
12297 if (rank <= REP_NEUTRAL)
12298 {
12299 return 1.0f;
12300 }
12301
12302 return 1.0f - 0.05f * (rank - REP_NEUTRAL);
12303}
ReputationRank
Definition: SharedDefines.h:179
@ REP_NEUTRAL
Definition: SharedDefines.h:183

References FactionTemplateEntry::faction, GetReputationRank(), and REP_NEUTRAL.

◆ GetReputationRank()

◆ GetReqKillOrCastCurrentCount()

uint16 Player::GetReqKillOrCastCurrentCount ( uint32  quest_id,
int32  entry 
)
1752{
1753 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1754 if (!qInfo)
1755 return 0;
1756
1757 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1758 if (qInfo->RequiredNpcOrGo[j] == entry)
1759 return m_QuestStatus[quest_id].CreatureOrGOCount[j];
1760
1761 return 0;
1762}

References m_QuestStatus, QUEST_OBJECTIVES_COUNT, Quest::RequiredNpcOrGo, and sObjectMgr.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), and npc_razael_and_lyana::OnGossipHello().

◆ GetRestBonus()

float Player::GetRestBonus ( ) const
inline
1212{ return _restBonus; }

References _restBonus.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ GetResurrectionSpellId()

uint32 Player::GetResurrectionSpellId ( )
12561{
12562 // search priceless resurrection possibilities
12563 uint32 prio = 0;
12564 uint32 spell_id = 0;
12566 for (AuraEffectList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
12567 {
12568 // Soulstone Resurrection // prio: 3 (max, non death persistent)
12569 if (prio < 2 && (*itr)->GetSpellInfo()->SpellVisual[0] == 99 && (*itr)->GetSpellInfo()->SpellIconID == 92)
12570 {
12571 switch ((*itr)->GetId())
12572 {
12573 case 20707:
12574 spell_id = 3026;
12575 break; // rank 1
12576 case 20762:
12577 spell_id = 20758;
12578 break; // rank 2
12579 case 20763:
12580 spell_id = 20759;
12581 break; // rank 3
12582 case 20764:
12583 spell_id = 20760;
12584 break; // rank 4
12585 case 20765:
12586 spell_id = 20761;
12587 break; // rank 5
12588 case 27239:
12589 spell_id = 27240;
12590 break; // rank 6
12591 case 47883:
12592 spell_id = 47882;
12593 break; // rank 7
12594 default:
12595 LOG_ERROR("entities.player", "Unhandled spell {}: S.Resurrection", (*itr)->GetId());
12596 continue;
12597 }
12598
12599 prio = 3;
12600 }
12601 // Twisting Nether // prio: 2 (max)
12602 else if ((*itr)->GetId() == 23701 && roll_chance_i(10))
12603 {
12604 prio = 2;
12605 spell_id = 23700;
12606 }
12607 }
12608
12609 // Reincarnation (passive spell) // prio: 1 // Glyph of Renewed Life
12610 if (prio < 1 && HasSpell(20608) && !HasSpellCooldown(21169) && (HasAura(58059) || HasItemCount(17030)))
12611 spell_id = 21169;
12612
12613 return spell_id;
12614}
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67
bool roll_chance_i(int chance)
Definition: Random.h:60

References Unit::GetAuraEffectsByType(), Unit::HasAura(), HasItemCount(), HasSpell(), HasSpellCooldown(), LOG_ERROR, roll_chance_i(), and SPELL_AURA_DUMMY.

Referenced by Unit::Kill(), and setDeathState().

◆ GetRewardedQuestCount()

std::size_t Player::GetRewardedQuestCount ( ) const
inline
1638{ return m_RewardedQuests.size(); }

References m_RewardedQuests.

Referenced by WorldSession::HandleQueryQuestsCompleted().

◆ getRewardedQuests()

RewardedQuestSet const & Player::getRewardedQuests ( ) const
inline

◆ GetRuneBaseCooldown()

uint32 Player::GetRuneBaseCooldown ( uint8  index,
bool  skipGrace 
)
13315{
13316 uint8 rune = GetBaseRune(index);
13317 uint32 cooldown = RUNE_BASE_COOLDOWN;
13318 if (!skipGrace)
13319 cooldown -= GetGracePeriod(index) < 250 ? 0 : GetGracePeriod(index) - 250; // xinef: reduce by grace period, treat first 250ms as instant use of rune
13320
13322 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
13323 {
13324 if ((*i)->GetMiscValue() == POWER_RUNE && (*i)->GetMiscValueB() == rune)
13325 cooldown = cooldown * (100 - (*i)->GetAmount()) / 100;
13326 }
13327
13328 return cooldown;
13329}
@ RUNE_BASE_COOLDOWN
Definition: Player.h:408
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
Definition: SpellAuraDefines.h:173
uint32 GetGracePeriod(uint8 index) const
Definition: Player.h:2519
RuneType GetBaseRune(uint8 index) const
Definition: Player.h:2516

References Unit::GetAuraEffectsByType(), GetBaseRune(), GetGracePeriod(), POWER_RUNE, RUNE_BASE_COOLDOWN, and SPELL_AURA_MOD_POWER_REGEN_PERCENT.

Referenced by Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetRuneCooldown()

uint32 Player::GetRuneCooldown ( uint8  index) const
inline

◆ GetRunesState()

uint8 Player::GetRunesState ( ) const
inline
2515{ return m_runes->runeState; }
uint8 runeState
Definition: Player.h:434

References m_runes, and Runes::runeState.

Referenced by Spell::EffectActivateRune(), and Spell::TakeRunePower().

◆ getRuneWeaponGUID()

ObjectGuid Player::getRuneWeaponGUID ( )
inline
2603{ return m_drwGUID; };
ObjectGuid m_drwGUID
Definition: Player.h:2604

References m_drwGUID.

◆ GetSaveTimer()

uint32 Player::GetSaveTimer ( ) const
inline
2365{ return m_nextSave; }

References m_nextSave.

Referenced by misc_commandscript::HandleSaveCommand().

◆ GetSelectedPlayer()

Player * Player::GetSelectedPlayer ( ) const
11496{
11497 if (ObjectGuid selectionGUID = GetGuidValue(UNIT_FIELD_TARGET))
11498 return ObjectAccessor::GetPlayer(*this, selectionGUID);
11499
11500 return nullptr;
11501}
@ UNIT_FIELD_TARGET
Definition: UpdateFields.h:92
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:220

References Object::GetGuidValue(), ObjectAccessor::GetPlayer(), and UNIT_FIELD_TARGET.

Referenced by Acore::ChatCommands::PlayerIdentifier::FromTarget().

◆ GetSelectedUnit()

◆ GetSemaphoreTeleportFar()

time_t Player::GetSemaphoreTeleportFar ( ) const
inline
2106{ return mSemaphoreTeleport_Far; }

References mSemaphoreTeleport_Far.

◆ GetSemaphoreTeleportNear()

time_t Player::GetSemaphoreTeleportNear ( ) const
inline
2105{ return mSemaphoreTeleport_Near; }

References mSemaphoreTeleport_Near.

◆ GetSession()

WorldSession * Player::GetSession ( ) const
inline
2007{ return m_session; }

References m_session.

Referenced by _addSpell(), _LoadHomeBind(), _LoadInventory(), Pet::_LoadSpellCooldowns(), Battleground::_ProcessProgress(), _SaveCharacter(), _SaveInstanceTimeRestrictions(), _StoreOrEquipNewItem(), ActivateSpec(), ActivateTaxiPathTo(), AddEnchantmentDuration(), AddItem(), Guild::AddMember(), InstanceMap::AddPlayerToMap(), AddRunePower(), addSpell(), Channel::Announce(), ApplyEquipCooldown(), Battlefield::AskToLeaveQueue(), TotemAI::AttackStart(), AutoUnequipOffhandIfNeed(), BanMgr::BanCharacter(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), BindToInstance(), Group::BroadcastPacket(), Group::BroadcastReadyCheck(), SocialMgr::BroadcastToFriendListers(), BuildPlayerRepop(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), WorldSession::CanOpenMailBox(), CanSpeak(), BattlegroundSA::CaptureGraveyard(), CharacterActionIpLogger::CharacterIPLogAction(), CharmSpellInitialize(), Spell::CheckCast(), CheckDuelDistance(), Spell::CheckEffectTarget(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::CheckRequiredBosses(), AchievementMgr::CompletedAchievement(), ContinueTaxiFlight(), ConvertRune(), Create(), Guild::Create(), ArenaTeam::DelMember(), Object::DestroyForPlayer(), Group::Disband(), InstanceScript::DoSendNotifyToInstance(), DuelComplete(), DurabilityRepair(), Spell::EffectApplyGlyph(), Spell::EffectDiscoverTaxi(), Spell::EffectDuel(), Spell::EffectPlaySound(), Spell::EffectSummonPlayer(), Spell::EffectSummonRaFFriend(), EquipItem(), BattlegroundSA::EventPlayerDamagedGO(), BGQueueInviteEvent::Execute(), SendEncounterUnit::Execute(), ExecuteOrCancelSpellCastRequest(), lfg::LFGMgr::FinishDungeon(), Channel::FlagsNotify(), GetAurasForTarget(), ChannelMgr::GetChannel(), SocialMgr::GetFriendInfo(), getMaxTimer(), GetsRecruitAFriendBonus(), GiveLevel(), Group::GroupLoot(), WorldSession::HandleAcceptGrantLevel(), WorldSession::HandleAcceptTradeOpcode(), account_commandscript::HandleAccountSetAddonCommand(), account_commandscript::HandleAccountSetGmLevelCommand(), spell_madrigosa_activate_barrier::HandleActivateObject(), spell_madrigosa_deactivate_barrier::HandleActivateObject(), WorldSession::HandleAddFriendOpcode(), misc_commandscript::HandleAddItemCommand(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleAuctionListItems(), AuraEffect::HandleAuraOpenStable(), AuraEffect::HandleAuraSetVehicle(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleBeginTradeOpcode(), character_commandscript::HandleCharacterLevel(), WorldSession::HandleChatIgnoredOpcode(), debug_commandscript::HandleDebugSendOpcodeCommand(), spell_gen_spirit_healer_res::HandleDummy(), cheat_commandscript::HandleExploreCheatCommand(), ticket_commandscript::HandleGMTicketUnAssignCommand(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupDeclineOpcode(), WorldSession::HandleGroupInviteOpcode(), group_commandscript::HandleGroupReviveCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), lookup_commandscript::HandleLookupPlayerIpCommand(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMessagechatOpcode(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyGenderCommand(), modify_commandscript::HandleModifyHPCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyMoneyCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), modify_commandscript::HandleModifySpellCommand(), WorldSession::HandleMovementOpcodes(), misc_commandscript::HandleMuteCommand(), WorldSession::HandleOfferPetitionOpcode(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleRaidReadyCheckOpcode(), reset_commandscript::HandleResetSpellsCommand(), reset_commandscript::HandleResetTalentsCommand(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_the_flag_of_ownership::HandleScript(), WorldSession::HandleSendMail(), send_commandscript::HandleSendMessageCommand(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), cheat_commandscript::HandleTaxiCheatCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnmuteCommand(), WorldSession::HandleWhoisOpcode(), WorldSession::HandleWhoOpcode(), ChatHandler::HasLowerSecurity(), hasSpanishClient(), lfg::LFGMgr::InitializeLockedDungeons(), InitTalentForLevel(), BattlegroundQueue::InviteGroupToBG(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), isBeingLoaded(), IsNeverVisible(), IsPetNeedBeTemporaryUnsummoned(), ObjectMgr::IsVendorItemValid(), IsVisibleGloballyFor(), Channel::JoinChannel(), lfg::LFGMgr::JoinLfg(), Channel::JoinNotify(), Unit::JumpTo(), Channel::KickOrBan(), Unit::KnockbackFrom(), Channel::LeaveNotify(), Channel::List(), LoadFromDB(), Pet::LoadPetFromDB(), GameObject::ModifyHealth(), ModifySpellCooldown(), Group::NeedBeforeGreed(), go_tele_to_dalaran_crystal::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), npc_augustus_the_touched::OnGossipSelect(), npc_rivern_frostwind::OnGossipSelect(), npc_roxi_ramrocket::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_wg_quest_giver::OnGossipSelect(), npc_drake_dealer_hurlunk::OnGossipSelect(), npc_shattrathflaskvendors::OnGossipSelect(), npc_slim::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_prof_leather::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), OnGossipSelect(), BattlefieldWG::OnPlayerLeaveWar(), ServerMailReward::OnPlayerLogin(), lfg::LFGPlayerScript::OnPlayerLogout(), lfg::LFGPlayerScript::OnPlayerMapChanged(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), Channel::Password(), Unit::PatchValuesUpdate(), InstanceMap::PermBindAllPlayers(), PetSpellInitialize(), Player(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), Battleground::PlayerAddedToBGCheckIfBGIsRunning(), InstanceSaveMgr::PlayerBindToInstance(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerUnbindInstance(), InstanceSaveMgr::PlayerUnbindInstanceNotExtended(), PossessSpellInitialize(), BattlegroundSA::PostUpdateImpl(), PrepareGossipMenu(), PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ProhibitSpellSchool(), Battleground::ReadyMarkerClicked(), RefundItem(), Group::RemoveMember(), RemovePet(), RemovePetitionsAndSigns(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), Group::ResetMaxEnchantingLevel(), ResurrectPlayer(), ResyncRunes(), RewardHonor(), Satisfy(), SatisfyQuestLog(), SaveToDB(), SendActionButtons(), npc_prof_alchemy::SendActionMenu(), npc_prof_blacksmith::SendActionMenu(), npc_prof_tailor::SendActionMenu(), AchievementMgr::SendAllAchievementData(), BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(), Battlefield::SendAreaSpiritHealerQueryOpcode(), SendAttackSwingBadFacingAttack(), SendAttackSwingCancelAttack(), SendAttackSwingCantAttack(), SendAttackSwingDeadTarget(), SendAttackSwingNotInRange(), AuctionHouseMgr::SendAuctionExpiredMail(), AuctionHouseMgr::SendAuctionOutbiddedMail(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), SendBuyError(), SendCanTakeQuestResponse(), Spell::SendCastResult(), SendCorpseReclaimDelay(), SendDuelCountdown(), SendDungeonDifficulty(), SendEnchantmentDurations(), SendEquipError(), SendEquipmentSetList(), SendExplorationExperience(), SocialMgr::SendFriendStatus(), ChatHandler::SendGMText(), SendInitialPacketsAfterAddToMap(), SendInitialPacketsBeforeAddToMap(), SendInitialSpells(), Map::SendInitTransports(), SendInstanceResetWarning(), BattlegroundQueue::SendJoinMessageArenaQueue(), SendLearnPacket(), SendLogXPGain(), Group::SendLootAllPassed(), Group::SendLootRoll(), Group::SendLootRollWon(), Group::SendLootStartRoll(), Group::SendLootStartRollToPlayer(), SendMailResult(), MailDraft::SendMailTo(), BattlegroundQueue::SendMessageBGQueue(), SendNewItem(), SendNewMail(), CreatureTextMgr::SendNonChatPacket(), AutobroadcastMgr::SendNotificationAnnouncement(), SendNotifyLootItemRemoved(), SendNotifyLootMoneyRemoved(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SendPetActionFeedback(), Unit::SendPetAIReaction(), Spell::SendPetCastResult(), Unit::SendPetTalk(), WorldObject::SendPlayMusic(), SendPreparedQuest(), SendProficiency(), SendPushToPartyResponse(), SendQuestComplete(), SendQuestConfirmAccept(), SendQuestFailed(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestTimerFailed(), SendQuestUpdateAddCreatureOrGo(), SendQuestUpdateAddItem(), SendQuestUpdateAddPlayer(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendRaidDifficulty(), SendRaidInfo(), SendRefundInfo(), SendRemoveControlBar(), Map::SendRemoveTransports(), SendResetFailedNotify(), SendResetInstanceFailed(), SendResetInstanceSuccess(), AchievementMgr::SendRespondInspectAchievements(), Spell::SendResurrectRequest(), SendSavedInstances(), SendSellError(), PlayerSocial::SendSocialList(), SendSystemMessage(), SendTalentsInfoData(), SendTalentWipeConfirm(), SendTeleportAckPacket(), Item::SendTimeUpdate(), Acore::VisibleNotifier::SendToSelf(), SendTransferAborted(), BattlegroundSA::SendTransportInit(), BattlegroundSA::SendTransportsRemove(), Item::SendUpdateSockets(), Group::SendUpdateToPlayer(), Object::SendUpdateToPlayer(), ReputationMgr::SendVisible(), AutobroadcastMgr::SendWorldAnnouncement(), ChatHandler::SendWorldText(), ChatHandler::SendWorldTextOptional(), TradeData::SetAccepted(), SetBindPoint(), SetClientControl(), Item::SetEnchantment(), SetEquipmentSet(), SetGameMaster(), SetGMVisible(), Channel::SetMode(), TradeData::SetMoney(), SetMovement(), Channel::SetOwner(), SetRestBonus(), Unit::SetStandState(), Guild::Member::SetStats(), SetTitle(), Channel::ShouldAnnouncePlayer(), SpawnCorpseBones(), SummonPet(), lfg::LFGMgr::TeleportPlayer(), TeleportTo(), Channel::ToggleModeration(), TradeCancel(), Channel::UnBan(), AuctionHouseSearcher::Update(), TradeData::Update(), Map::Update(), Pet::Update(), GameObject::Update(), Update(), PetAI::UpdateAI(), UpdateForQuestWorldObjects(), UpdateHomebindTime(), UpdateLocalChannels(), Group::UpdatePlayerOutOfRange(), UpdatePosition(), UpdateSpeakTime(), UpdateTriggerVisibility(), GameObject::Use(), VehicleSpellInitialize(), Whisper(), and Unit::Whisper().

◆ GetShield()

Item * Player::GetShield ( bool  useable = false) const
524{
525 Item* item = nullptr;
526 if (useable)
528 else
530 if (!item || item->GetTemplate()->Class != ITEM_CLASS_ARMOR)
531 return nullptr;
532
533 if (!useable)
534 return item;
535
536 if (item->IsBroken())
537 return nullptr;
538
539 return item;
540}
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1262

References ItemTemplate::Class, EQUIPMENT_SLOT_OFFHAND, GetItemByPos(), Item::GetTemplate(), GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), and ITEM_CLASS_ARMOR.

Referenced by AuraEffect::CalculateAmount().

◆ GetShieldBlockValue()

uint32 Player::GetShieldBlockValue ( ) const
overridevirtual

Implements Unit.

5095{
5097
5098 value = (value < 0) ? 0 : value;
5099
5100 return uint32(value);
5101}

References FLAT_MOD, Unit::GetStat(), m_auraBaseMod, PCT_MOD, SHIELD_BLOCK_VALUE, and STAT_STRENGTH.

Referenced by UpdateShieldBlockValue().

◆ GetSightRange()

float Player::GetSightRange ( WorldObject const *  target = nullptr) const
overridevirtual

Reimplemented from WorldObject.

16227{
16228 float sightRange = WorldObject::GetSightRange(target);
16230 {
16231 sightRange += *_farSightDistance;
16232 }
16233
16234 return sightRange;
16235}
virtual float GetSightRange(WorldObject const *target=nullptr) const
Definition: Object.cpp:1683

References _farSightDistance, and WorldObject::GetSightRange().

Referenced by Group::UpdatePlayerOutOfRange(), and UpdateVisibilityForPlayer().

◆ GetSkillPermBonusValue()

int16 Player::GetSkillPermBonusValue ( uint32  skill) const
5536{
5537 if (!skill)
5538 return 0;
5539
5540 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5541 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5542 return 0;
5543
5545}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_PERM_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillStatusMap() [1/2]

SkillStatusMap & Player::GetSkillStatusMap ( )
inline
1788{ return mSkillStatus; }

References mSkillStatus.

◆ GetSkillStatusMap() [2/2]

SkillStatusMap const & Player::GetSkillStatusMap ( ) const
inline
1787{ return mSkillStatus; }

References mSkillStatus.

Referenced by WorldSession::HandleAuctionListItems().

◆ GetSkillStep()

uint16 Player::GetSkillStep ( uint16  skill) const
5447{
5448 if (!skill)
5449 return 0;
5450
5451 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5452 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5453 return 0;
5454
5455 return PAIR32_HIPART(GetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos)));
5456}
uint16 PAIR32_HIPART(uint32 x)
Definition: ObjectDefines.h:92

References Object::GetUInt32Value(), mSkillStatus, PAIR32_HIPART(), PLAYER_SKILL_INDEX, and SKILL_DELETED.

Referenced by learn_commandscript::HandleLearnAllRecipesCommand(), and misc_commandscript::HandleSetSkillCommand().

◆ GetSkillTempBonusValue()

int16 Player::GetSkillTempBonusValue ( uint32  skill) const
5548{
5549 if (!skill)
5550 return 0;
5551
5552 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5553 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5554 return 0;
5555
5557}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_TEMP_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillValue()

◆ GetSocial()

◆ GetSpec()

uint32 Player::GetSpec ( int8  spec = -1)
15953{
15954 uint32 mostTalentTabId = 0;
15955 uint32 mostTalentCount = 0;
15956 uint32 specIdx = 0;
15957
15958 if (m_specsCount) // not all instances of Player have a spec for some reason
15959 {
15960 if (spec < 0)
15961 specIdx = m_activeSpec;
15962 else
15963 specIdx = spec;
15964 // find class talent tabs (all players have 3 talent tabs)
15965 uint32 const* talentTabIds = GetTalentTabPages(getClass());
15966
15967 for (uint8 i = 0; i < MAX_TALENT_TABS; ++i)
15968 {
15969 uint32 talentCount = 0;
15970 uint32 talentTabId = talentTabIds[i];
15971 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
15972 {
15973 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
15974 if (!talentInfo)
15975 continue;
15976
15977 // skip another tab talents
15978 if (talentInfo->TalentTab != talentTabId)
15979 continue;
15980
15981 // find max talent rank (0~4)
15982 int8 curtalent_maxrank = -1;
15983 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
15984 {
15985 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], specIdx))
15986 {
15987 curtalent_maxrank = rank;
15988 break;
15989 }
15990 }
15991
15992 // not learned talent
15993 if (curtalent_maxrank < 0)
15994 continue;
15995
15996 talentCount += curtalent_maxrank + 1;
15997 }
15998
15999 if (mostTalentCount < talentCount)
16000 {
16001 mostTalentCount = talentCount;
16002 mostTalentTabId = talentTabId;
16003 }
16004 }
16005 }
16006 return mostTalentTabId;
16007}
uint32 const * GetTalentTabPages(uint8 cls)
Definition: DBCStores.cpp:824
#define MAX_TALENT_TABS
Definition: DBCStructure.h:1921

References Unit::getClass(), GetTalentTabPages(), HasTalent(), m_activeSpec, m_specsCount, MAX_TALENT_RANK, MAX_TALENT_TABS, TalentEntry::RankID, sTalentStore, and TalentEntry::TalentTab.

Referenced by HasCasterSpec(), HasHealSpec(), HasMeleeSpec(), and HasTankSpec().

◆ GetSpecsCount()

uint8 Player::GetSpecsCount ( ) const
inline

◆ GetSpellByProto()

uint32 Player::GetSpellByProto ( ItemTemplate proto)

◆ GetSpellCooldownDelay()

uint32 Player::GetSpellCooldownDelay ( uint32  spell_id) const
16287{
16288 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16289 return uint32(itr != m_spellCooldowns.end() && itr->second.end > getMSTime() ? itr->second.end - getMSTime() : 0);
16290}
uint32 getMSTime()
Definition: Timer.h:103

References getMSTime(), and m_spellCooldowns.

Referenced by CanExecutePendingSpellCastRequest(), CanRequestSpellCast(), Aura::HandleAuraSpecificMods(), npc_brewfest_keg_reciver::MoveInLineOfSight(), and ProhibitSpellSchool().

◆ GetSpellCooldownMap() [1/2]

SpellCooldowns & Player::GetSpellCooldownMap ( )
inline
1785{ return m_spellCooldowns; }

References m_spellCooldowns.

◆ GetSpellCooldownMap() [2/2]

◆ GetSpellCooldowns()

SpellCooldowns Player::GetSpellCooldowns ( ) const
inline
2178{ return m_spellCooldowns; }

References m_spellCooldowns.

Referenced by Unit::HandleDummyAuraProc().

◆ GetSpellCritFromIntellect()

float Player::GetSpellCritFromIntellect ( )
5174{
5175 uint8 level = GetLevel();
5176 uint32 pclass = getClass();
5177
5178 if (level > GT_MAX_LEVEL)
5179 level = GT_MAX_LEVEL;
5180
5181 GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass - 1);
5182 GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5183 if (!critBase || !critRatio)
5184 return 0.0f;
5185
5186 float crit = critBase->base + GetStat(STAT_INTELLECT) * critRatio->ratio;
5187 return crit * 100.0f;
5188}
DBCStorage< GtChanceToSpellCritBaseEntry > sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt)
DBCStorage< GtChanceToSpellCritEntry > sGtChanceToSpellCritStore(GtChanceToSpellCritfmt)
Definition: DBCStructure.h:1063
float base
Definition: DBCStructure.h:1064
Definition: DBCStructure.h:1073
float ratio
Definition: DBCStructure.h:1074

References GtChanceToSpellCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToSpellCritEntry::ratio, sGtChanceToSpellCritBaseStore, sGtChanceToSpellCritStore, and STAT_INTELLECT.

Referenced by UpdateSpellCritChance().

◆ GetSpellMap() [1/2]

PlayerSpellMap & Player::GetSpellMap ( )
inline
1782{ return m_spells; }

References m_spells.

◆ GetSpellMap() [2/2]

◆ GetSpellModList()

SpellModList const & Player::GetSpellModList ( uint32  type) const
inline
2622{ return m_spellMods[type]; }

References m_spellMods.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld().

◆ GetSpellPenetrationItemMod()

int32 Player::GetSpellPenetrationItemMod ( ) const
inline

◆ GetSpellQueueWindow()

uint32 Player::GetSpellQueueWindow ( ) const
protected
2307{
2308 return sWorld->getIntConfig(CONFIG_SPELL_QUEUE_WINDOW);
2309}
@ CONFIG_SPELL_QUEUE_WINDOW
Definition: IWorld.h:426

References CONFIG_SPELL_QUEUE_WINDOW, and sWorld.

Referenced by CanExecutePendingSpellCastRequest(), and CanRequestSpellCast().

◆ GetsRecruitAFriendBonus()

bool Player::GetsRecruitAFriendBonus ( bool  forXP)
12634{
12635 bool recruitAFriend = false;
12636 if (GetLevel() <= sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL) || !forXP)
12637 {
12638 if (Group* group = this->GetGroup())
12639 {
12640 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12641 {
12642 Player* player = itr->GetSource();
12643 if (!player || !player->IsInMap(this))
12644 continue;
12645
12646 if (!player->IsAtRecruitAFriendDistance(this))
12647 continue; // member (alive or dead) or his corpse at req. distance
12648
12649 if (forXP)
12650 {
12651 // level must be allowed to get RaF bonus
12652 if (player->GetLevel() > sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
12653 continue;
12654
12655 // level difference must be small enough to get RaF bonus, UNLESS we are lower level
12656 if (player->GetLevel() < GetLevel())
12658 continue;
12659 }
12660
12661 bool ARecruitedB = (player->GetSession()->GetRecruiterId() == GetSession()->GetAccountId());
12662 bool BRecruitedA = (GetSession()->GetRecruiterId() == player->GetSession()->GetAccountId());
12663 if (ARecruitedB || BRecruitedA)
12664 {
12665 recruitAFriend = true;
12666 break;
12667 }
12668 }
12669 }
12670 }
12671 return recruitAFriend;
12672}
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL
Definition: IWorld.h:247
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE
Definition: IWorld.h:248
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1296
bool IsAtRecruitAFriendDistance(WorldObject const *pOther) const
Definition: Player.cpp:12743
uint32 GetRecruiterId() const
Definition: WorldSession.h:540
uint32 GetAccountId() const
Definition: WorldSession.h:375

References CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE, WorldSession::GetAccountId(), GetGroup(), Unit::GetLevel(), WorldSession::GetRecruiterId(), GetSession(), IsAtRecruitAFriendDistance(), WorldObject::IsInMap(), GroupReference::next(), and sWorld.

Referenced by CalculateReputationGain(), GiveXP(), and SetRestBonus().

◆ GetStartPosition()

WorldLocation Player::GetStartPosition ( ) const
11352{
11353 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
11354 uint32 mapId = info->mapId;
11356 return WorldLocation(0, 2352.0f, -5709.0f, 154.5f, 0.0f);
11357 return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0);
11358}

References CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, Unit::getClass(), Unit::getRace(), HasSpell(), IsClass(), PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, and sObjectMgr.

Referenced by misc_commandscript::HandleUnstuckCommand().

◆ GetStoredRaidDifficulty()

Difficulty Player::GetStoredRaidDifficulty ( ) const
inline
1931{ return m_raidMapDifficulty; } // only for use in difficulty packet after exiting to raid map

References m_raidMapDifficulty.

Referenced by SendInitialPacketsAfterAddToMap().

◆ GetSubGroup()

uint8 Player::GetSubGroup ( ) const
inline

◆ GetSummonExpireTimer()

time_t Player::GetSummonExpireTimer ( ) const
inline
1119{ return m_summon_expire; }

References m_summon_expire.

Referenced by Spell::CheckCast().

◆ GetTalentMap()

◆ GetTalentTreePoints()

void Player::GetTalentTreePoints ( uint8(&)  specPoints[3]) const
15224{
15225 const PlayerTalentMap& talentMap = GetTalentMap();
15226 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15227 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15228 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15229 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15230 if (tab->tabpage < 3)
15231 {
15232 // find current talent rank
15233 uint8 currentTalentRank = 0;
15234 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15235 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15236 {
15237 currentTalentRank = rank + 1;
15238 break;
15239 }
15240 specPoints[tab->tabpage] += currentTalentRank;
15241 }
15242}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

Referenced by lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTeamId()

TeamId Player::GetTeamId ( bool  original = false) const
inline
2118{ return original ? TeamIdForRace(getRace(true)) : m_team; };
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5851

References Unit::getRace(), m_team, and TeamIdForRace().

Referenced by ActivateTaxiPathTo(), GameObject::ActivateToQuest(), BattlegroundQueue::AddGroup(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), npc_love_in_air_snivel::AllowAction(), BattlegroundSA::AllowDefenseOfTheAncients(), LootItem::AllowedForPlayer(), Battlefield::AskToLeaveQueue(), SocialMgr::BroadcastToFriendListers(), WorldState::BuffMagtheridonTeam(), Corpse::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_steam_powered_auctioneer::npc_steam_powered_auctioneerAI::CanBeSeen(), npc_mei_francis_mount::npc_mei_francis_mountAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), OPvPCapturePointZM_Graveyard::CanTalkTo(), CanUseItem(), BattlegroundSA::CaptureGraveyard(), ServerMailCondition::CheckCondition(), ContinueTaxiFlight(), MapInstanced::CreateInstance(), BattlegroundSA::DefendersPortalTeleport(), WorldState::DispelMagtheridonTeam(), BattlegroundIC::DoAction(), DuelComplete(), Spell::EffectTeleportUnits(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundIC::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), BattlegroundAV::EventPlayerDefendsPoint(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundSA::EventPlayerUsedGO(), GetBgTeamId(), Battlefield::GetClosestGraveyard(), BattlegroundAB::GetClosestGraveyard(), BattlegroundAV::GetClosestGraveyard(), BattlegroundEY::GetClosestGraveyard(), BattlegroundIC::GetClosestGraveyard(), BattlegroundSA::GetClosestGraveyard(), BattlegroundWS::GetClosestGraveyard(), SocialMgr::GetFriendInfo(), ObjectMgr::GetModelForShapeshift(), Battleground::GetRealRepFactionForPlayer(), Guild::HandleAcceptMember(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), BattlegroundEY::HandleAreaTrigger(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleArenaTeamAcceptOpcode(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleCalendarEventInvite(), OutdoorPvPSI::HandleDropFlag(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), BattlefieldWG::HandleKill(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundAV::HandleKillPlayer(), BattlegroundIC::HandleKillPlayer(), BattlegroundAV::HandleKillUnit(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleOfferPetitionOpcode(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), WorldState::HandlePlayerEnterZone(), Battlefield::HandlePlayerEnterZone(), OutdoorPvP::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), WorldState::HandlePlayerLeaveZone(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), BattlegroundIC::HandlePlayerResurrect(), BattlegroundAV::HandleQuestComplete(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), WorldSession::HandleSendMail(), WorldSession::HandleWhoOpcode(), Battlefield::HasPlayer(), OutdoorPvP::HasPlayer(), lfg::LFGMgr::InitializeLockedDungeons(), Channel::Invite(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), SpellArea::IsFitToRequirements(), IsGroupVisibleFor(), BfCapturePoint::IsInsideObjective(), OPvPCapturePoint::IsInsideObjective(), lfg::LFGMgr::JoinRaidBrowser(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), Unit::Kill(), lfg::LFGMgr::LfrSearchAdd(), lfg::LFGMgr::LfrSearchRemove(), lfg::LFGMgr::LfrSetComment(), LoadFromDB(), AchievementCriteriaData::Meets(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_not_even_a_scratch::OnCheck(), BattlefieldWG::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_spirit_guide::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), instance_utgarde_keep::instance_utgarde_keep_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerLogin(), ServerMailReward::OnPlayerLogin(), MidsummerPlayerScript::OnPlayerUpdateZone(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), AreaTrigger_at_legion_teleporter::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::PassengerBoarded(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), RepopAtGraveyard(), ReportedAfkBy(), RewardHonor(), RewardReputation(), Satisfy(), AchievementMgr::SendAchievementEarned(), WorldSession::SendListInventory(), SendLoot(), Acore::MessageDistDeliverer::SendPacket(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), WorldSession::SendSpiritResurrect(), SendTaxiNodeStatusMultiple(), WorldSession::SendTaxiStatus(), Creature::SendZoneUnderAttackMessage(), spell_item_recall::SetDest(), SetEntryPoint(), SetFactionForRace(), Channel::SetMode(), Channel::SetOwner(), npc_midsummer_torch_target::SpellHit(), BattlegroundSA::TeleportToEntrancePosition(), OPvPCapturePoint::Update(), UpdateArea(), npc_midsummer_bonfire::UpdateBonfireBlessingBuffs(), UpdateLFGChannel(), UpdateLocalChannels(), UpdateZone(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ GetTeleportDest()

WorldLocation & Player::GetTeleportDest ( )
inline

◆ GetTemporaryUnsummonedPetNumber()

uint32 Player::GetTemporaryUnsummonedPetNumber ( ) const
inline

◆ GetTotalBaseModValue()

float Player::GetTotalBaseModValue ( BaseModGroup  modGroup) const
5081{
5082 if (modGroup >= BASEMOD_END)
5083 {
5084 LOG_ERROR("entities.player", "wrong BaseModGroup in GetTotalBaseModValue()!");
5085 return 0.0f;
5086 }
5087
5088 if (m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5089 return 0.0f;
5090
5091 return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
5092}

References BASEMOD_END, FLAT_MOD, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetTotalPercentageModValue()

float Player::GetTotalPercentageModValue ( BaseModGroup  modGroup) const
inline
2206{ return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }

References FLAT_MOD, m_auraBaseMod, and PCT_MOD.

Referenced by UpdateCritPercentage().

◆ GetTotalPlayedTime()

◆ GetTradeData()

◆ GetTrader()

Player * Player::GetTrader ( ) const
inline
1387{ return m_trade ? m_trade->GetTrader() : nullptr; }
Player * GetTrader() const
Definition: TradeData.h:41

References TradeData::GetTrader(), and m_trade.

Referenced by WorldSession::moveItems(), and UpdatePosition().

◆ GetTrainerSpellState()

TrainerSpellState Player::GetTrainerSpellState ( TrainerSpell const *  trainer_spell) const
3898{
3899 if (!trainer_spell)
3900 return TRAINER_SPELL_RED;
3901
3902 bool hasSpell = true;
3903 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3904 {
3905 if (!trainer_spell->learnedSpell[i])
3906 continue;
3907
3908 if (!HasSpell(trainer_spell->learnedSpell[i]))
3909 {
3910 hasSpell = false;
3911 break;
3912 }
3913 }
3914 // known spell
3915 if (hasSpell)
3916 return TRAINER_SPELL_GRAY;
3917
3918 // check skill requirement
3919 if (trainer_spell->reqSkill && GetBaseSkillValue(trainer_spell->reqSkill) < trainer_spell->reqSkillValue)
3920 return TRAINER_SPELL_RED;
3921
3922 // check level requirement
3923 if (GetLevel() < trainer_spell->reqLevel)
3924 return TRAINER_SPELL_RED;
3925
3926 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3927 {
3928 if (!trainer_spell->learnedSpell[i])
3929 continue;
3930
3931 // check race/class requirement
3932 if (!IsSpellFitByClassAndRace(trainer_spell->learnedSpell[i]))
3933 return TRAINER_SPELL_RED;
3934
3935 if (uint32 prevSpell = sSpellMgr->GetPrevSpellInChain(trainer_spell->learnedSpell[i]))
3936 {
3937 // check prev.rank requirement
3938 if (prevSpell && !HasSpell(prevSpell))
3939 return TRAINER_SPELL_RED;
3940 }
3941
3942 SpellsRequiringSpellMapBounds spellsRequired = sSpellMgr->GetSpellsRequiredForSpellBounds(trainer_spell->learnedSpell[i]);
3943 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequired.first; itr != spellsRequired.second; ++itr)
3944 {
3945 // check additional spell requirement
3946 if (!HasSpell(itr->second))
3947 return TRAINER_SPELL_RED;
3948 }
3949 }
3950
3951 // check primary prof. limit
3952 // first rank of primary profession spell when there are no proffesions avalible is disabled
3953 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3954 {
3955 if (!trainer_spell->learnedSpell[i])
3956 continue;
3957 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainer_spell->learnedSpell[i]);
3958 if (learnedSpellInfo && learnedSpellInfo->IsPrimaryProfessionFirstRank() && (GetFreePrimaryProfessionPoints() == 0))
3960 }
3961
3962 return TRAINER_SPELL_GREEN;
3963}
@ TRAINER_SPELL_GREEN
Definition: Player.h:214
@ TRAINER_SPELL_GRAY
Definition: Player.h:216
@ TRAINER_SPELL_GREEN_DISABLED
Definition: Player.h:217
@ TRAINER_SPELL_RED
Definition: Player.h:215
std::pair< SpellsRequiringSpellMap::const_iterator, SpellsRequiringSpellMap::const_iterator > SpellsRequiringSpellMapBounds
Definition: SpellMgr.h:570
bool IsSpellFitByClassAndRace(uint32 spell_id) const
Definition: Player.cpp:12305

References GetBaseSkillValue(), GetFreePrimaryProfessionPoints(), Unit::GetLevel(), HasSpell(), SpellInfo::IsPrimaryProfessionFirstRank(), IsSpellFitByClassAndRace(), TrainerSpell::learnedSpell, MAX_SPELL_EFFECTS, TrainerSpell::reqLevel, TrainerSpell::reqSkill, TrainerSpell::reqSkillValue, sSpellMgr, TRAINER_SPELL_GRAY, TRAINER_SPELL_GREEN, TRAINER_SPELL_GREEN_DISABLED, and TRAINER_SPELL_RED.

Referenced by WorldSession::HandleTrainerBuySpellOpcode(), and WorldSession::SendTrainerList().

◆ GetUseableItemByPos()

Item * Player::GetUseableItemByPos ( uint8  bag,
uint8  slot 
) const
inline

◆ GetViewpoint()

WorldObject * Player::GetViewpoint ( ) const
13158{
13160 return static_cast<WorldObject*>(ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_SEER));
13161 return nullptr;
13162}
@ TYPEMASK_SEER
Definition: ObjectGuid.h:54
Object * GetObjectByTypeMask(WorldObject const &, ObjectGuid const guid, uint32 typemask)
Definition: ObjectAccessor.cpp:141
Definition: Object.h:411

References Object::GetGuidValue(), ObjectAccessor::GetObjectByTypeMask(), PLAYER_FARSIGHT, and TYPEMASK_SEER.

Referenced by CinematicMgr::EndCinematic(), WorldSession::HandleFarSightOpcode(), ArenaSpectator::HandleSpectatorWatchCommand(), RemoveFromWorld(), StopCastingBindSight(), and Map::Update().

◆ GetWeaponForAttack()

Item * Player::GetWeaponForAttack ( WeaponAttackType  attackType,
bool  useable = false 
) const
489{
490 uint8 slot;
491 switch (attackType)
492 {
493 case BASE_ATTACK:
495 break;
496 case OFF_ATTACK:
498 break;
499 case RANGED_ATTACK:
501 break;
502 default:
503 return nullptr;
504 }
505
506 Item* item = nullptr;
507 if (useable)
509 else
511 if (!item || item->GetTemplate()->Class != ITEM_CLASS_WEAPON)
512 return nullptr;
513
514 if (!useable)
515 return item;
516
517 if (item->IsBroken() || IsInFeralForm())
518 return nullptr;
519
520 return item;
521}

References BASE_ATTACK, ItemTemplate::Class, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetItemByPos(), Item::GetTemplate(), GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), Unit::IsInFeralForm(), ITEM_CLASS_WEAPON, OFF_ATTACK, and RANGED_ATTACK.

Referenced by AuraEffect::CalculateAmount(), CheckAmmoCompatibility(), Spell::CheckItems(), Spell::EffectEnchantItemTmp(), Spell::EffectWeaponDmg(), Unit::GetAPMultiplier(), GetBaseWeaponSkillValue(), GetMeleeDamageSchoolMask(), AuraEffect::HandleAuraModWeaponCritPercent(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), HasWeapon(), HasWeaponForAttack(), SetRegularAttackTime(), SetSheath(), Spell::Spell(), boss_viscidus::SpellHit(), Spell::TakeAmmo(), UpdateExpertise(), UpdateWeaponSkill(), and Spell::WriteAmmoToPacket().

◆ GetWeaponProficiency()

uint32 Player::GetWeaponProficiency ( ) const
inline
1372{ return m_WeaponProficiency; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ GetXPRestBonus()

uint32 Player::GetXPRestBonus ( uint32  xp)
8872{
8873 uint32 rested_bonus = (uint32)GetRestBonus(); // xp for each rested bonus
8874
8875 if (rested_bonus > xp) // max rested_bonus == xp or (r+x) = 200% xp
8876 rested_bonus = xp;
8877
8878 SetRestBonus(GetRestBonus() - rested_bonus);
8879
8880 LOG_DEBUG("entities.player", "Player gain {} xp (+ {} Rested Bonus). Rested points={}", xp + rested_bonus, rested_bonus, GetRestBonus());
8881 return rested_bonus;
8882}
void SetRestBonus(float restBonusNew)
Definition: Player.cpp:10147
float GetRestBonus() const
Definition: Player.h:1212

References GetRestBonus(), LOG_DEBUG, and SetRestBonus().

Referenced by GiveXP().

◆ GetZoneIdFromDB()

uint32 Player::GetZoneIdFromDB ( ObjectGuid  guid)
static
6339{
6340 ObjectGuid::LowType guidLow = guid.GetCounter();
6341
6343 stmt->SetData(0, guidLow);
6344 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6345
6346 if (!result)
6347 return 0;
6348
6349 Field* fields = result->Fetch();
6350 uint32 zone = fields[0].Get<uint16>();
6351
6352 if (!zone)
6353 {
6354 // stored zone is zero, use generic and slow zone detection
6355 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_POSITION_XYZ);
6356 stmt->SetData(0, guidLow);
6357 PreparedQueryResult posResult = CharacterDatabase.Query(stmt);
6358
6359 if (!posResult)
6360 {
6361 return 0;
6362 }
6363
6364 fields = posResult->Fetch();
6365 uint32 map = fields[0].Get<uint16>();
6366 float posx = fields[1].Get<float>();
6367 float posy = fields[2].Get<float>();
6368 float posz = fields[3].Get<float>();
6369
6370 if (!sMapStore.LookupEntry(map))
6371 return 0;
6372
6373 zone = sMapMgr->GetZoneId(PHASEMASK_NORMAL, map, posx, posy, posz);
6374
6375 if (zone > 0)
6376 {
6377 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ZONE);
6378
6379 stmt->SetData(0, uint16(zone));
6380 stmt->SetData(1, guidLow);
6381
6382 CharacterDatabase.Execute(stmt);
6383 }
6384 }
6385
6386 return zone;
6387}
@ CHAR_SEL_CHAR_POSITION_XYZ
Definition: CharacterDatabase.h:53
@ CHAR_UPD_ZONE
Definition: CharacterDatabase.h:296
@ CHAR_SEL_CHAR_ZONE
Definition: CharacterDatabase.h:51

References CHAR_SEL_CHAR_POSITION_XYZ, CHAR_SEL_CHAR_ZONE, CHAR_UPD_ZONE, CharacterDatabase, Field::Get(), ObjectGuid::GetCounter(), PHASEMASK_NORMAL, PreparedStatementBase::SetData(), sMapMgr, and sMapStore.

Referenced by Guild::Member::LoadFromDB().

◆ GiveLevel()

void Player::GiveLevel ( uint8  level)
Todo:
find some better solution
2455{
2456 uint8 oldLevel = GetLevel();
2457 if (level == oldLevel)
2458 return;
2459
2460 if (!sScriptMgr->OnPlayerCanGiveLevel(this, level))
2461 return;
2462
2463 if (Guild* guild = GetGuild())
2464 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level);
2465
2466 PlayerLevelInfo info;
2467 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), level, &info);
2468
2469 PlayerClassLevelInfo classInfo;
2470 sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, &classInfo);
2471
2473 packet.Level = level;
2474 packet.HealthDelta = int32(classInfo.basehealth) - int32(GetCreateHealth());
2475
2477 // for (int i = 0; i < MAX_POWERS; ++i)
2478 packet.PowerDelta[0] = int32(classInfo.basemana) - int32(GetCreateMana());
2479 packet.PowerDelta[1] = 0;
2480 packet.PowerDelta[2] = 0;
2481 packet.PowerDelta[3] = 0;
2482 packet.PowerDelta[4] = 0;
2483 packet.PowerDelta[5] = 0;
2484
2485 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2486 packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i));
2487
2488 SendDirectMessage(packet.Write());
2489
2490 SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(level));
2491
2492 //update level, max level of skills
2493 m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset
2494
2496
2497 SetLevel(level);
2498
2500
2501 // save base values (bonuses already included in stored stats
2502 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2503 SetCreateStat(Stats(i), info.stats[i]);
2504
2505 SetCreateHealth(classInfo.basehealth);
2506 SetCreateMana(classInfo.basemana);
2507
2511
2513
2514 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when leveling up
2516
2518
2519 if (!isDead())
2520 {
2521 // set current level health and mana/energy to maximum after applying all mods.
2522 SetFullHealth();
2529 }
2530
2531 // update level to hunter/summon pet
2532 if (Pet* pet = GetPet())
2533 pet->SynchronizeLevelWithOwner();
2534
2535 MailLevelReward const* mailReward = sObjectMgr->GetMailLevelReward(level, getRaceMask());
2536 if (mailReward && sScriptMgr->OnPlayerCanGiveMailRewardAtGiveLevel(this, level))
2537 {
2538 //- TODO: Poor design of mail system
2539 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2540 MailDraft(mailReward->mailTemplateId).SendMailTo(trans, this, MailSender(MAIL_CREATURE, mailReward->senderEntry));
2541 CharacterDatabase.CommitTransaction(trans);
2542 }
2543
2545
2546 // Refer-A-Friend
2547 if (GetSession()->GetRecruiterId())
2548 if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
2549 if (level % 2 == 0)
2550 {
2552
2553 if (!HasByteFlag(PLAYER_FIELD_BYTES, 1, 0x01))
2555 }
2556
2558
2559 sScriptMgr->OnPlayerLevelChanged(this, oldLevel);
2560}
@ PLAYER_NEXT_LEVEL_XP
Definition: UpdateFields.h:340
@ GUILD_MEMBER_DATA_LEVEL
Definition: Guild.h:59
@ CONFIG_ALWAYS_MAXSKILL
Definition: IWorld.h:125
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL
Definition: DBCEnums.h:124
@ POWER_RAGE
Definition: SharedDefines.h:270
@ POWER_HAPPINESS
Definition: SharedDefines.h:273
@ POWER_ENERGY
Definition: SharedDefines.h:272
@ POWER_FOCUS
Definition: SharedDefines.h:271
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:949
Definition: Player.h:295
uint32 basehealth
Definition: Player.h:297
uint32 basemana
Definition: Player.h:298
Definition: Player.h:309
std::array< uint32, MAX_STATS > stats
Definition: Player.h:315
void _ApplyAllLevelScaleItemMods(bool apply)
Definition: Player.cpp:7611
void UpdateSkillsToMaxSkillsForLevel()
Definition: PlayerUpdates.cpp:1130
Guild * GetGuild() const
Definition: Player.cpp:15946
void UpdateSkillsForLevel()
Definition: PlayerUpdates.cpp:1079
void SendQuestGiverStatusMultiple()
Definition: Player.cpp:7688
void SetCreateStat(Stats stat, float val)
Definition: Unit.h:1001
void SetCreateHealth(uint32 val)
Definition: Unit.h:1049
void SetCreateMana(uint32 val)
Definition: Unit.h:1071
void SetLevel(uint8 lvl, bool showLevelChange=true)
Definition: Unit.cpp:15511
uint32 GetCreateHealth() const
Definition: Unit.h:1033
uint32 GetCreateMana() const
Definition: Unit.h:1070
bool isDead() const
Definition: Unit.h:1700
Definition: ObjectMgr.h:543
uint32 senderEntry
Definition: ObjectMgr.h:549
uint32 mailTemplateId
Definition: ObjectMgr.h:548
Definition: MiscPackets.h:45
uint32 Level
Definition: MiscPackets.h:51
std::array< uint32, MAX_STATS > StatDelta
Definition: MiscPackets.h:54
std::array< uint32, MAX_POWERS > PowerDelta
Definition: MiscPackets.h:53
uint32 HealthDelta
Definition: MiscPackets.h:52
WorldPacket const * Write() override
Definition: MiscPackets.cpp:34

References _ApplyAllLevelScaleItemMods(), ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL, PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CharacterDatabase, CONFIG_ALWAYS_MAXSKILL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreateHealth(), Unit::GetCreateMana(), Unit::GetCreateStat(), GetGuild(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Unit::getRaceMask(), GetSession(), GUILD_MEMBER_DATA_LEVEL, Object::HasByteFlag(), WorldPackets::Misc::LevelUpInfo::HealthDelta, InitGlyphsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), Unit::isDead(), WorldPackets::Misc::LevelUpInfo::Level, m_grantableLevels, m_Played_time, MAIL_CREATURE, MailLevelReward::mailTemplateId, MAX_STATS, PLAYED_TIME_LEVEL, PLAYER_FIELD_BYTES, PLAYER_NEXT_LEVEL_XP, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, WorldPackets::Misc::LevelUpInfo::PowerDelta, SendDirectMessage(), MailLevelReward::senderEntry, MailDraft::SendMailTo(), SendQuestGiverStatusMultiple(), Object::SetByteFlag(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Unit::SetFullHealth(), Unit::SetLevel(), Unit::SetPower(), Unit::SetUInt32Value(), sObjectMgr, sScriptMgr, STAT_STRENGTH, WorldPackets::Misc::LevelUpInfo::StatDelta, PlayerLevelInfo::stats, sWorld, UpdateAchievementCriteria(), UpdateAllStats(), UpdateSkillsForLevel(), UpdateSkillsToMaxSkillsForLevel(), and WorldPackets::Misc::LevelUpInfo::Write().

Referenced by GiveXP(), WorldSession::HandleAcceptGrantLevel(), and character_commandscript::HandleCharacterLevel().

◆ GiveQuestSourceItem()

bool Player::GiveQuestSourceItem ( Quest const *  quest)
1336{
1337 uint32 srcitem = quest->GetSrcItemId();
1338 if (srcitem > 0)
1339 {
1340 uint32 count = quest->GetSrcItemCount();
1341 if (count <= 0)
1342 count = 1;
1343
1344 ItemPosCountVec dest;
1345 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
1346 if (msg == EQUIP_ERR_OK)
1347 {
1348 Item* item = StoreNewItem(dest, srcitem, true);
1349 SendNewItem(item, count, true, false);
1350 return true;
1351 }
1352 // player already have max amount required item, just report success
1353 else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS)
1354 return true;
1355 else
1356 SendEquipError(msg, nullptr, nullptr, srcitem);
1357 return false;
1358 }
1359
1360 return true;
1361}

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by AddQuest().

◆ GiveXP()

void Player::GiveXP ( uint32  xp,
Unit victim,
float  group_rate = 1.0f,
bool  isLFGReward = false 
)
2380{
2381 if (xp < 1)
2382 {
2383 return;
2384 }
2385
2386 if (!IsAlive() && !GetBattlegroundId() && !isLFGReward)
2387 {
2388 return;
2389 }
2390
2392 {
2393 return;
2394 }
2395
2396 if (victim && victim->IsCreature() && !victim->ToCreature()->hasLootRecipient())
2397 {
2398 return;
2399 }
2400
2401 uint8 level = GetLevel();
2402
2403 // Favored experience increase START
2404 uint32 zone = GetZoneId();
2405 float favored_exp_mult = 0;
2406 if ((zone == AREA_HELLFIRE_PENINSULA || zone == AREA_HELLFIRE_RAMPARTS || zone == AREA_MAGTHERIDONS_LAIR || zone == AREA_THE_BLOOD_FURNACE || zone == AREA_THE_SHATTERED_HALLS) && HasAnyAuras(32096 /*Thrallmar's Favor*/, 32098 /*Honor Hold's Favor*/))
2407 favored_exp_mult = 0.05f; // Thrallmar's Favor and Honor Hold's Favor
2408
2409 xp = uint32(xp * (1 + favored_exp_mult));
2410 // Favored experience increase END
2411
2412 // XP to money conversion processed in Player::RewardQuest
2413 if (level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2414 return;
2415
2416 uint32 bonus_xp = 0;
2417 bool recruitAFriend = GetsRecruitAFriendBonus(true);
2418
2419 // RaF does NOT stack with rested experience
2420 if (recruitAFriend)
2421 bonus_xp = 2 * xp; // xp + bonus_xp must add up to 3 * xp for RaF; calculation for quests done client-side
2422 else
2423 bonus_xp = victim ? GetXPRestBonus(xp) : 0; // XP resting bonus
2424
2425 // hooks and multipliers can modify the xp with a zero or negative value
2426 // check again before sending invalid xp to the client
2427 if (xp < 1)
2428 {
2429 return;
2430 }
2431
2432 SendLogXPGain(xp, victim, bonus_xp, recruitAFriend, group_rate);
2433
2436 uint32 newXP = curXP + xp + bonus_xp;
2437
2438 while (newXP >= nextLvlXP && level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2439 {
2440 newXP -= nextLvlXP;
2441
2442 if (level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2443 GiveLevel(level + 1);
2444
2445 level = GetLevel();
2447 }
2448
2449 SetUInt32Value(PLAYER_XP, newXP);
2450}
@ PLAYER_FLAGS_NO_XP_GAIN
Definition: Player.h:505
@ AREA_THE_BLOOD_FURNACE
Definition: AreaDefines.h:119
@ AREA_HELLFIRE_RAMPARTS
Definition: AreaDefines.h:108
@ AREA_MAGTHERIDONS_LAIR
Definition: AreaDefines.h:130
@ AREA_HELLFIRE_PENINSULA
Definition: AreaDefines.h:97
@ AREA_THE_SHATTERED_HALLS
Definition: AreaDefines.h:120
bool hasLootRecipient() const
Definition: Creature.h:235
bool IsCreature() const
Definition: Object.h:205
void GiveLevel(uint8 level)
Definition: Player.cpp:2454
uint32 GetXPRestBonus(uint32 xp)
Definition: Player.cpp:8871
void SendLogXPGain(uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
Definition: Player.cpp:2360
bool HasAnyAuras(Auras... spellIds) const
Checks if the unit has ANY specified auras.
Definition: Unit.h:1393

References AREA_HELLFIRE_PENINSULA, AREA_HELLFIRE_RAMPARTS, AREA_MAGTHERIDONS_LAIR, AREA_THE_BLOOD_FURNACE, AREA_THE_SHATTERED_HALLS, CONFIG_MAX_PLAYER_LEVEL, GetBattlegroundId(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), GetXPRestBonus(), WorldObject::GetZoneId(), GiveLevel(), Unit::HasAnyAuras(), Creature::hasLootRecipient(), HasPlayerFlag(), Unit::IsAlive(), Object::IsCreature(), PLAYER_FLAGS_NO_XP_GAIN, PLAYER_NEXT_LEVEL_XP, PLAYER_XP, SendLogXPGain(), Unit::SetUInt32Value(), sWorld, and Object::ToCreature().

Referenced by KillRewarder::_RewardXP(), CheckAreaExploreAndOutdoor(), RewardHonor(), and RewardQuest().

◆ GroupEventHappens()

void Player::GroupEventHappens ( uint32  questId,
WorldObject const *  pEventObject 
)
1819{
1820 if (Group* group = GetGroup())
1821 {
1822 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
1823 {
1824 Player* player = itr->GetSource();
1825
1826 // for any leave or dead (with not released body) group member at appropriate distance
1827 if (player && player->IsAtGroupRewardDistance(pEventObject) && !player->GetCorpse())
1828 player->AreaExploredOrEventHappens(questId);
1829 }
1830 }
1831 else
1833}
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition: Player.cpp:12707
void AreaExploredOrEventHappens(uint32 questId)
Definition: PlayerQuest.cpp:1791

References AreaExploredOrEventHappens(), GetCorpse(), GetGroup(), IsAtGroupRewardDistance(), and GroupReference::next().

Referenced by SmartAI::EndPath(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), Map::ScriptsProcess(), SmartAI::StopFollow(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_rinji::npc_rinjiAI::WaypointReached(), npc_corporal_keeshan::npc_corporal_keeshanAI::WaypointReached(), npc_deathstalker_erland::npc_deathstalker_erlandAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached(), npc_gilthares::npc_giltharesAI::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_bonker_togglevolt::npc_bonker_togglevoltAI::WaypointReached(), npc_emily::npc_emilyAI::WaypointReached(), npc_apothecary_hanes::npc_Apothecary_HanesAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::WaypointReached(), npc_bessy::npc_bessyAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), npc_kservant::npc_kservantAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleBaseModValue()

void Player::HandleBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  amount,
bool  apply 
)
5027{
5028 if (modGroup >= BASEMOD_END)
5029 {
5030 LOG_ERROR("entities.player", "ERROR in HandleBaseModValue(): non existed BaseModGroup!");
5031 return;
5032 }
5033
5034 switch (modType)
5035 {
5036 case FLAT_MOD:
5037 m_auraBaseMod[modGroup][modType] += apply ? amount : -amount;
5038 break;
5039 case PCT_MOD:
5040 ApplyPercentModFloatVar(m_auraBaseMod[modGroup][modType], amount, apply);
5041 break;
5042 }
5043
5044 if (!CanModifyStats())
5045 return;
5046
5047 switch (modGroup)
5048 {
5049 case CRIT_PERCENTAGE:
5051 break;
5054 break;
5057 break;
5058 case SHIELD_BLOCK_VALUE:
5060 break;
5061 default:
5062 break;
5063 }
5064}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
void UpdateShieldBlockValue()
Definition: StatSystem.cpp:522
void UpdateCritPercentage(WeaponAttackType attType)
Definition: StatSystem.cpp:641

References ApplyPercentModFloatVar(), BASE_ATTACK, BASEMOD_END, Unit::CanModifyStats(), CRIT_PERCENTAGE, FLAT_MOD, LOG_ERROR, m_auraBaseMod, OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PCT_MOD, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, SHIELD_BLOCK_VALUE, UpdateCritPercentage(), and UpdateShieldBlockValue().

Referenced by _ApplyItemBonuses(), _ApplyWeaponDependentAuraCritMod(), ApplyEnchantment(), AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleAuraModWeaponCritPercent(), and AuraEffect::HandleShieldBlockValue().

◆ HandleDrowning()

void Player::HandleDrowning ( uint32  time_diff)
protected
Todo:
: Check this formula
Todo:
: Check this formula
841{
843 return;
844
845 // In water
847 {
848 // Breath timer not activated - activate it
850 {
853 }
854 else // If activated - do tick
855 {
856 m_MirrorTimer[BREATH_TIMER] -= time_diff;
857 // Timer limit - need deal damage
859 {
861 // Calculate and deal damage
863 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
865 }
866 else if (!(m_MirrorTimerFlagsLast & UNDERWATER_INWATER)) // Update time in client if need
868 }
869 }
870 else if (m_MirrorTimer[BREATH_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
871 {
872 int32 UnderWaterTime = getMaxTimer(BREATH_TIMER);
873 // Need breath regen
874 m_MirrorTimer[BREATH_TIMER] += 10 * time_diff;
875 if (m_MirrorTimer[BREATH_TIMER] >= UnderWaterTime || !IsAlive())
879 }
880
881 // In dark water
883 {
884 // Fatigue timer not activated - activate it
886 {
889 }
890 else
891 {
892 m_MirrorTimer[FATIGUE_TIMER] -= time_diff;
893 // Timer limit - need deal damage or teleport ghost to graveyard
895 {
897 if (IsAlive()) // Calculate and deal damage
898 {
899 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
901 }
902 else if (HasPlayerFlag(PLAYER_FLAGS_GHOST)) // Teleport ghost to graveyard
904 }
907 }
908 }
909 else if (m_MirrorTimer[FATIGUE_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
910 {
911 int32 DarkWaterTime = getMaxTimer(FATIGUE_TIMER);
912 m_MirrorTimer[FATIGUE_TIMER] += 10 * time_diff;
913 if (m_MirrorTimer[FATIGUE_TIMER] >= DarkWaterTime || !IsAlive())
917 }
918
919 if (m_MirrorTimerFlags & (UNDERWATER_INLAVA /*| UNDERWATER_INSLIME*/) && !(_lastLiquid && _lastLiquid->SpellId))
920 {
921 // Breath timer not activated - activate it
924 else
925 {
926 m_MirrorTimer[FIRE_TIMER] -= time_diff;
927 if (m_MirrorTimer[FIRE_TIMER] < 0)
928 {
929 m_MirrorTimer[FIRE_TIMER] += 2020;
930 // Calculate and deal damage
932 uint32 damage = urand(600, 700);
935 // need to skip Slime damage in Undercity,
936 // maybe someone can find better way to handle environmental damage
937 //else if (m_zoneUpdateId != 1497)
938 // EnvironmentalDamage(DAMAGE_SLIME, damage);
939 }
940 }
941 }
942 else
944
945 // Recheck timers flag
946 m_MirrorTimerFlags &= ~UNDERWATER_EXIST_TIMERS;
947 for (uint8 i = 0; i < MAX_TIMERS; ++i)
949 {
951 break;
952 }
954}
@ DAMAGE_DROWNING
Definition: Player.h:841
@ DAMAGE_EXHAUSTED
Definition: Player.h:840
@ UNDERWATER_INDARKWATER
Definition: Player.h:104
@ UNDERWATER_EXIST_TIMERS
Definition: Player.h:106
@ UNDERWATER_INWATER
Definition: Player.h:101
@ UNDERWATER_INLAVA
Definition: Player.h:102
void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
Definition: Player.cpp:737
uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
Definition: Player.cpp:760
void RepopAtGraveyard()
Definition: Player.cpp:4927
int32 getMaxTimer(MirrorTimerType timer)
Definition: Player.cpp:813
void StopMirrorTimer(MirrorTimerType Type)
Definition: Player.cpp:748
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:2105
uint32 SpellId
Definition: DBCStructure.h:1290

References Unit::_lastLiquid, BREATH_TIMER, DAMAGE_DROWNING, DAMAGE_EXHAUSTED, DAMAGE_LAVA, DISABLED_MIRROR_TIMER, EnvironmentalDamage(), FATIGUE_TIMER, FIRE_TIMER, Unit::GetLevel(), Unit::GetMaxHealth(), getMaxTimer(), HasPlayerFlag(), IN_MILLISECONDS, Unit::IsAlive(), m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, MAX_TIMERS, PLAYER_FLAGS_GHOST, RepopAtGraveyard(), SendMirrorTimer(), LiquidTypeEntry::SpellId, StopMirrorTimer(), UNDERWATER_EXIST_TIMERS, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INWATER, and urand().

Referenced by Update().

◆ HandleFall()

void Player::HandleFall ( MovementInfo const &  movementInfo)
13794{
13795 // calculate total z distance of the fall
13796 float z_diff = m_lastFallZ - movementInfo.pos.GetPositionZ();
13797
13798 //Players with low fall distance, Feather Fall or physical immunity (charges used) are ignored
13799 // 14.57 can be calculated by resolving damageperc formula below to 0
13800 if (z_diff >= 14.57f && !isDead() && !IsGameMaster() && !GetCommandStatus(CHEAT_GOD) &&
13802 !HasFlyAura())
13803 {
13804 //Safe fall, fall height reduction
13806
13807 float damageperc = 0.018f * (z_diff - safe_fall) - 0.2426f;
13808 uint32 original_health = GetHealth(), final_damage = 0;
13809
13811 {
13812 uint32 damage = (uint32)(damageperc * GetMaxHealth() * sWorld->getRate(RATE_DAMAGE_FALL));
13813
13814 //float height = movementInfo.pos.m_positionZ;
13815 //UpdateGroundPositionZ(movementInfo.pos.m_positionX, movementInfo.pos.m_positionY, height);
13816
13817 if (damage > 0)
13818 {
13819 //Prevent fall damage from being more than the player maximum health
13820 if (damage > GetMaxHealth())
13821 damage = GetMaxHealth();
13822
13823 // Gust of Wind
13824 if (HasAura(43621))
13825 damage = GetMaxHealth() / 2;
13826
13827 // Divine Protection
13828 if (HasAura(498))
13829 {
13830 damage /= 2;
13831 }
13832
13833 final_damage = EnvironmentalDamage(DAMAGE_FALL, damage);
13834 }
13835
13836 //Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction
13837 LOG_DEBUG("entities.player", "FALLDAMAGE mZ={} z={} fallTime={} damage={} SF={}", movementInfo.pos.GetPositionZ(), GetPositionZ(), movementInfo.fallTime, damage, safe_fall);
13838 }
13839
13840 // recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case
13841 if (IsAlive() && final_damage < original_health)
13843 }
13844}
@ CHEAT_GOD
Definition: Player.h:1005
@ SPELL_AURA_SAFE_FALL
Definition: SpellAuraDefines.h:207
@ RATE_DAMAGE_FALL
Definition: IWorld.h:511
@ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
Definition: DBCEnums.h:139
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1196
bool HasFlyAura() const
Definition: Unit.h:1708
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12945

References ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, CHEAT_GOD, DAMAGE_FALL, EnvironmentalDamage(), MovementInfo::fallTime, GetCommandStatus(), Unit::GetHealth(), Unit::GetMaxHealth(), Position::GetPositionZ(), Unit::GetTotalAuraModifier(), Unit::HasAura(), Unit::HasFeatherFallAura(), Unit::HasFlyAura(), Unit::HasHoverAura(), Unit::IsAlive(), Unit::isDead(), IsGameMaster(), Unit::IsImmunedToDamageOrSchool(), LOG_DEBUG, m_lastFallZ, MovementInfo::pos, RATE_DAMAGE_FALL, SPELL_AURA_SAFE_FALL, SPELL_SCHOOL_MASK_NORMAL, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMovementOpcodes().

◆ HandleSobering()

void Player::HandleSobering ( )
protected

The player sobers by 1% every 9 seconds.

958{
959 m_drunkTimer = 0;
960
961 uint8 currentDrunkValue = GetDrunkValue();
962 uint8 drunk = currentDrunkValue ? --currentDrunkValue : 0;
963 SetDrunkValue(drunk);
964}
void SetDrunkValue(uint8 newDrunkValue, uint32 itemId=0)
Definition: Player.cpp:977

References GetDrunkValue(), m_drunkTimer, and SetDrunkValue().

Referenced by Update().

◆ Has310Flyer()

bool Player::Has310Flyer ( bool  checkAllSpells,
uint32  excludeSpellId = 0 
)
3486{
3487 if (!checkAllSpells)
3489 else
3490 {
3491 SetHas310Flyer(false);
3492 SpellInfo const* spellInfo;
3493 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
3494 {
3495 // pussywizard:
3496 if (itr->second->State == PLAYERSPELL_REMOVED)
3497 continue;
3498
3499 if (itr->first == excludeSpellId)
3500 continue;
3501
3502 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(itr->first);
3503 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3504 {
3505 if (_spell_idx->second->SkillLine != SKILL_MOUNTS)
3506 break; // We can break because mount spells belong only to one skillline (at least 310 flyers do)
3507
3508 spellInfo = sSpellMgr->AssertSpellInfo(itr->first);
3509 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3510 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3511 spellInfo->Effects[i].CalcValue() == 310)
3512 {
3513 SetHas310Flyer(true);
3514 return true;
3515 }
3516 }
3517 }
3518 }
3519
3520 return false;
3521}
@ PLAYER_EXTRA_HAS_310_FLYER
Definition: Player.h:596

References SpellInfo::Effects, m_ExtraFlags, m_spells, MAX_SPELL_EFFECTS, PLAYER_EXTRA_HAS_310_FLYER, PLAYERSPELL_REMOVED, SetHas310Flyer(), SKILL_MOUNTS, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, and sSpellMgr.

Referenced by _addSpell(), and removeSpell().

◆ HasAchieved()

bool Player::HasAchieved ( uint32  achievementId) const

◆ HasActivePowerType()

bool Player::HasActivePowerType ( Powers  power)
overridevirtual

Reimplemented from Unit.

2751{
2752 if (sScriptMgr->OnPlayerHasActivePowerType(this, power))
2753 return true;
2754 else
2755 return (getPowerType() == power);
2756}

References Unit::getPowerType(), and sScriptMgr.

Referenced by Create(), and ResetAllPowers().

◆ HasActiveSpell()

bool Player::HasActiveSpell ( uint32  spell) const
3892{
3893 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3894 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active && itr->second->IsInSpec(m_activeSpec));
3895}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by _AddSpellCooldown(), ActivateSpec(), spell_dk_dancing_rune_weapon::CheckProc(), WorldSession::HandleCastSpellOpcode(), and learnSpell().

◆ HasAtLoginFlag()

◆ HasCasterSpec()

bool Player::HasCasterSpec ( )
16051{
16052 switch (GetSpec(GetActiveSpec()))
16053 {
16066 return true;
16067 default:
16068 break;
16069 }
16070 return false;
16071}
@ TALENT_TREE_HUNTER_SURVIVAL
Definition: Player.h:153
@ TALENT_TREE_MAGE_FIRE
Definition: Player.h:167
@ TALENT_TREE_PRIEST_SHADOW
Definition: Player.h:159
@ TALENT_TREE_SHAMAN_ELEMENTAL
Definition: Player.h:163
@ TALENT_TREE_HUNTER_BEAST_MASTERY
Definition: Player.h:151
@ TALENT_TREE_WARLOCK_DEMONOLOGY
Definition: Player.h:170
@ TALENT_TREE_WARLOCK_DESTRUCTION
Definition: Player.h:171
@ TALENT_TREE_WARLOCK_AFFLICTION
Definition: Player.h:169
@ TALENT_TREE_MAGE_ARCANE
Definition: Player.h:166
@ TALENT_TREE_MAGE_FROST
Definition: Player.h:168
@ TALENT_TREE_DRUID_BALANCE
Definition: Player.h:172
@ TALENT_TREE_HUNTER_MARKSMANSHIP
Definition: Player.h:152
uint32 GetSpec(int8 spec=-1)
Definition: Player.cpp:15952

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_BALANCE, TALENT_TREE_HUNTER_BEAST_MASTERY, TALENT_TREE_HUNTER_MARKSMANSHIP, TALENT_TREE_HUNTER_SURVIVAL, TALENT_TREE_MAGE_ARCANE, TALENT_TREE_MAGE_FIRE, TALENT_TREE_MAGE_FROST, TALENT_TREE_PRIEST_SHADOW, TALENT_TREE_SHAMAN_ELEMENTAL, TALENT_TREE_WARLOCK_AFFLICTION, TALENT_TREE_WARLOCK_DEMONOLOGY, and TALENT_TREE_WARLOCK_DESTRUCTION.

◆ HasCorpse()

◆ HasDelayedTeleport()

bool Player::HasDelayedTeleport ( ) const
inlineprivate
2960{ return m_bHasDelayedTeleport; }

References m_bHasDelayedTeleport.

Referenced by Update().

◆ HasEnoughMoney() [1/2]

bool Player::HasEnoughMoney ( int32  amount) const
inline
1621 {
1622 if (amount > 0)
1623 return (GetMoney() >= (uint32) amount);
1624 return true;
1625 }

References GetMoney().

◆ HasEnoughMoney() [2/2]

◆ HasFreeBattlegroundQueueId()

bool Player::HasFreeBattlegroundQueueId ( ) const

◆ HasHealSpec()

bool Player::HasHealSpec ( )
16074{
16075 switch (GetSpec(GetActiveSpec()))
16076 {
16082 return true;
16083 default:
16084 break;
16085 }
16086 return false;
16087}
@ TALENT_TREE_DRUID_RESTORATION
Definition: Player.h:174
@ TALENT_TREE_SHAMAN_RESTORATION
Definition: Player.h:165
@ TALENT_TREE_PRIEST_HOLY
Definition: Player.h:158
@ TALENT_TREE_PALADIN_HOLY
Definition: Player.h:148
@ TALENT_TREE_PRIEST_DISCIPLINE
Definition: Player.h:157

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_RESTORATION, TALENT_TREE_PALADIN_HOLY, TALENT_TREE_PRIEST_DISCIPLINE, TALENT_TREE_PRIEST_HOLY, and TALENT_TREE_SHAMAN_RESTORATION.

◆ HasItemCount()

bool Player::HasItemCount ( uint32  item,
uint32  count = 1,
bool  inBankAlso = false 
) const
656{
657 uint32 tempcount = 0;
659 {
661 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
662 {
663 tempcount += pItem->GetCount();
664 if (tempcount >= count)
665 return true;
666 }
667 }
669 {
671 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
672 {
673 tempcount += pItem->GetCount();
674 if (tempcount >= count)
675 return true;
676 }
677 }
679 {
680 if (Bag* pBag = GetBagByPos(i))
681 {
682 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
683 {
684 Item* pItem = GetItemByPos(i, j);
685 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
686 {
687 tempcount += pItem->GetCount();
688 if (tempcount >= count)
689 return true;
690 }
691 }
692 }
693 }
694
695 if (inBankAlso)
696 {
698 {
700 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
701 {
702 tempcount += pItem->GetCount();
703 if (tempcount >= count)
704 return true;
705 }
706 }
708 {
709 if (Bag* pBag = GetBagByPos(i))
710 {
711 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
712 {
713 Item* pItem = GetItemByPos(i, j);
714 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
715 {
716 tempcount += pItem->GetCount();
717 if (tempcount >= count)
718 return true;
719 }
720 }
721 }
722 }
723 }
724
725 return false;
726}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, Item::IsInTrade(), and KEYRING_SLOT_START.

Referenced by LootItem::AllowedForPlayer(), BuyItemFromVendorSlot(), CanCompleteRepeatableQuest(), Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), Spell::EffectCreateItem2(), GetResurrectionSpellId(), go_soulwell::go_soulwellAI::GossipHello(), go_celestial_planetarium_access::go_celestial_planetarium_accessAI::GossipHello(), misc_commandscript::HandleAddItemCommand(), lfg::LFGMgr::InitializeLockedDungeons(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_oculus_drakegiver::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), AreaTrigger_at_voltarus_middle::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_twilight_grove::OnTrigger(), NPCStaveQuestAI::QuestIncomplete(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Satisfy(), npc_aquementas::npc_aquementasAI::SendItem(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and Spell::WriteCastResultInfo().

◆ HasItemFitToSpellRequirements()

bool Player::HasItemFitToSpellRequirements ( SpellInfo const *  spellInfo,
Item const *  ignoreItem = nullptr 
) const
12467{
12468 if (spellInfo->EquippedItemClass < 0)
12469 return true;
12470
12471 // scan other equipped items for same requirements (mostly 2 daggers/etc)
12472 // for optimize check 2 used cases only
12473 switch (spellInfo->EquippedItemClass)
12474 {
12475 case ITEM_CLASS_WEAPON:
12476 {
12479 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12480 return true;
12481 break;
12482 }
12483 case ITEM_CLASS_ARMOR:
12484 {
12485 // tabard not have dependent spells
12488 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12489 return true;
12490
12491 // shields can be equipped to offhand slot
12493 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12494 return true;
12495
12496 // ranged slot can have some armor subclasses
12498 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12499 return true;
12500
12501 break;
12502 }
12503 default:
12504 LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Not handled spell requirement for item class {}", spellInfo->EquippedItemClass);
12505 break;
12506 }
12507
12508 return false;
12509}

References EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, SpellInfo::EquippedItemClass, GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsFitToSpellRequirements(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, and LOG_ERROR.

Referenced by Unit::CalcArmorReducedDamage(), Spell::CheckItems(), and RemoveItemDependentAurasAndCasts().

◆ HasItemOrGemWithIdEquipped()

bool Player::HasItemOrGemWithIdEquipped ( uint32  item,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
729{
730 uint32 tempcount = 0;
732 {
733 if (i == except_slot)
734 continue;
735
737 if (pItem && pItem->GetEntry() == item)
738 {
739 tempcount += pItem->GetCount();
740 if (tempcount >= count)
741 return true;
742 }
743 }
744
745 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
746 if (pProto && pProto->GemProperties)
747 {
749 {
750 if (i == except_slot)
751 continue;
752
754 if (pItem && pItem->GetTemplate()->Socket[0].Color)
755 {
756 tempcount += pItem->GetGemCountWithID(item);
757 if (tempcount >= count)
758 return true;
759 }
760 }
761 }
762
763 return false;
764}
uint8 GetGemCountWithID(uint32 GemID) const
Definition: Item.cpp:1014

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, Item::GetCount(), Object::GetEntry(), Item::GetGemCountWithID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, sObjectMgr, and ItemTemplate::Socket.

Referenced by npc_eris_hevenfire::npc_eris_hevenfireAI::CanBeSeen(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::CanBeSeen(), CanEquipUniqueItem(), achievement_pb_pilgrims_peril::OnCheck(), and achievement_pb_terokkar_turkey_time::OnCheck().

◆ HasItemOrGemWithLimitCategoryEquipped()

bool Player::HasItemOrGemWithLimitCategoryEquipped ( uint32  limitCategory,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
767{
768 uint32 tempcount = 0;
770 {
771 if (i == except_slot)
772 continue;
773
775 if (!pItem)
776 continue;
777
778 ItemTemplate const* pProto = pItem->GetTemplate();
779 if (!pProto)
780 continue;
781
782 if (pProto->ItemLimitCategory == limitCategory)
783 {
784 tempcount += pItem->GetCount();
785 if (tempcount >= count)
786 return true;
787 }
788
790 {
791 tempcount += pItem->GetGemCountWithLimitCategory(limitCategory);
792 if (tempcount >= count)
793 return true;
794 }
795 }
796
797 return false;
798}

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetCount(), Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::ItemLimitCategory, PRISMATIC_ENCHANTMENT_SLOT, and ItemTemplate::Socket.

Referenced by CanEquipUniqueItem().

◆ HasItemTotemCategory()

bool Player::HasItemTotemCategory ( uint32  TotemCategory) const
852{
853 Item* pItem;
855 {
858 return true;
859 }
861 {
864 return true;
865 }
867 {
868 if (Bag* pBag = GetBagByPos(i))
869 {
870 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
871 {
872 pItem = GetItemByPos(i, j);
874 return true;
875 }
876 }
877 }
878 return false;
879}
TotemCategory
Definition: SharedDefines.h:3083
bool IsTotemCategoryCompatiableWith(ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
Definition: PlayerStorage.cpp:881

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, IsTotemCategoryCompatiableWith(), and KEYRING_SLOT_START.

Referenced by Spell::CheckItems().

◆ HasMeleeSpec()

bool Player::HasMeleeSpec ( )
16028{
16029 switch (GetSpec(GetActiveSpec()))
16030 {
16040 return true;
16042 if (GetShapeshiftForm() == FORM_CAT)
16043 return true;
16044 default:
16045 break;
16046 }
16047 return false;
16048}
@ FORM_CAT
Definition: UnitDefines.h:70
@ TALENT_TREE_DEATH_KNIGHT_FROST
Definition: Player.h:161
@ TALENT_TREE_DRUID_FERAL_COMBAT
Definition: Player.h:173
@ TALENT_TREE_WARRIOR_FURY
Definition: Player.h:146
@ TALENT_TREE_ROGUE_ASSASSINATION
Definition: Player.h:154
@ TALENT_TREE_DEATH_KNIGHT_UNHOLY
Definition: Player.h:162
@ TALENT_TREE_SHAMAN_ENHANCEMENT
Definition: Player.h:164
@ TALENT_TREE_WARRIOR_ARMS
Definition: Player.h:145
@ TALENT_TREE_ROGUE_COMBAT
Definition: Player.h:155
@ TALENT_TREE_PALADIN_RETRIBUTION
Definition: Player.h:150
@ TALENT_TREE_ROGUE_SUBTLETY
Definition: Player.h:156

References FORM_CAT, GetActiveSpec(), Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_FROST, TALENT_TREE_DEATH_KNIGHT_UNHOLY, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_RETRIBUTION, TALENT_TREE_ROGUE_ASSASSINATION, TALENT_TREE_ROGUE_COMBAT, TALENT_TREE_ROGUE_SUBTLETY, TALENT_TREE_SHAMAN_ENHANCEMENT, TALENT_TREE_WARRIOR_ARMS, and TALENT_TREE_WARRIOR_FURY.

◆ HasPendingBind()

◆ HasPendingSpectatorForBG()

bool Player::HasPendingSpectatorForBG ( uint32  bgInstanceId) const
inline
2590{ return m_pendingSpectatorForBG == bgInstanceId; }

References m_pendingSpectatorForBG.

Referenced by WorldSession::HandleMoveWorldportAck(), and TeleportTo().

◆ HasPlayerFlag()

◆ HasPvPForcingQuest()

bool Player::HasPvPForcingQuest ( ) const
2496{
2497 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2498 {
2499 uint32 questId = GetQuestSlotQuestId(i);
2500 if (questId == 0)
2501 continue;
2502
2503 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
2504 if (!quest)
2505 continue;
2506
2507 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
2508 return true;
2509 }
2510
2511 return false;
2512}

References GetQuestSlotQuestId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_FLAGS_PVP, and sObjectMgr.

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), and UpdateZone().

◆ HasQuest()

bool Player::HasQuest ( uint32  questId) const
102{
103 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
104 {
105 uint32 questid = GetQuestSlotQuestId(i);
106 if (questid == questId)
107 {
108 return true;
109 }
110 }
111
112 return false;
113}

References GetQuestSlotQuestId(), and MAX_QUEST_LOG_SIZE.

◆ HasQuestForGO()

bool Player::HasQuestForGO ( int32  GOId) const
12331{
12332 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
12333 {
12334 uint32 questid = GetQuestSlotQuestId(i);
12335 if (questid == 0)
12336 continue;
12337
12338 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
12339 if (qs_itr == m_QuestStatus.end())
12340 continue;
12341
12342 QuestStatusData const& qs = qs_itr->second;
12343
12345 {
12346 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
12347 if (!qinfo)
12348 continue;
12349
12350 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
12351 continue;
12352
12353 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
12354 {
12355 if (qinfo->RequiredNpcOrGo[j] >= 0) //skip non GO case
12356 continue;
12357
12358 if ((-1)*GOId == qinfo->RequiredNpcOrGo[j] && qs.CreatureOrGOCount[j] < qinfo->RequiredNpcOrGoCount[j])
12359 return true;
12360 }
12361 }
12362 }
12363 return false;
12364}
Difficulty GetDifficulty(bool isRaid) const
Definition: Player.h:1928
bool IsAllowedInRaid(Difficulty difficulty) const
Definition: QuestDef.cpp:296

References QuestStatusData::CreatureOrGOCount, GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::IsAllowedInRaid(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::ActivateToQuest().

◆ HasQuestForItem()

bool Player::HasQuestForItem ( uint32  itemId,
uint32  excludeQuestId = 0,
bool  turnIn = false,
bool *  showInLoot = nullptr 
) const
2265{
2266 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2267 {
2268 uint32 questid = GetQuestSlotQuestId(i);
2269 if (questid == 0 || questid == excludeQuestId)
2270 continue;
2271
2272 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
2273 if (qs_itr == m_QuestStatus.end())
2274 continue;
2275
2276 QuestStatusData const& q_status = qs_itr->second;
2277
2278 if ((q_status.Status == QUEST_STATUS_INCOMPLETE) || (turnIn && q_status.Status == QUEST_STATUS_COMPLETE))
2279 {
2280 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
2281 if (!qinfo)
2282 continue;
2283
2284 // hide quest if player is in raid-group and quest is no raid quest
2285 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
2286 {
2287 if (!InBattleground() && !GetGroup()->isBFGroup()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later
2288 {
2289 continue;
2290 }
2291 }
2292
2293 // There should be no mixed ReqItem/ReqSource drop
2294 // This part for ReqItem drop
2295 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
2296 {
2297 if (itemid == qinfo->RequiredItemId[j] && q_status.ItemCount[j] < qinfo->RequiredItemCount[j])
2298 {
2299 if (showInLoot)
2300 {
2301 if (GetItemCount(itemid, true) < qinfo->RequiredItemCount[j])
2302 {
2303 return true;
2304 }
2305
2306 *showInLoot = false;
2307 }
2308 else
2309 {
2310 return true;
2311 }
2312 }
2313
2314 if (turnIn && q_status.ItemCount[j] >= qinfo->RequiredItemCount[j])
2315 {
2316 return true;
2317 }
2318 }
2319 // This part - for ReqSource
2320 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
2321 {
2322 // examined item is a source item
2323 if (qinfo->ItemDrop[j] == itemid)
2324 {
2325 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
2326 uint32 ownedCount = GetItemCount(itemid, true);
2327 // 'unique' item
2328 if ((pProto->MaxCount && int32(ownedCount) < pProto->MaxCount) || (turnIn && int32(ownedCount) >= pProto->MaxCount))
2329 return true;
2330
2331 // allows custom amount drop when not 0
2332 if (qinfo->ItemDropQuantity[j])
2333 {
2334 if ((ownedCount < qinfo->ItemDropQuantity[j]) || (turnIn && ownedCount >= qinfo->ItemDropQuantity[j]))
2335 return true;
2336 }
2337 else if (ownedCount < pProto->GetMaxStackSize())
2338 return true;
2339 }
2340 }
2341 }
2342 }
2343 return false;
2344}
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:303
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:302
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:300

References GetDifficulty(), GetGroup(), GetItemCount(), WorldObject::GetMap(), GetQuestSlotQuestId(), InBattleground(), Quest::IsAllowedInRaid(), QuestStatusData::ItemCount, Quest::ItemDrop, Quest::ItemDropQuantity, m_QuestStatus, MAX_QUEST_LOG_SIZE, ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and QuestStatusData::Status.

Referenced by LootItem::AllowedForPlayer(), LootTemplate::HasQuestDropForPlayer(), LootTemplate::LootGroup::HasQuestDropForPlayer(), at_twilight_grove::OnTrigger(), and RewardQuest().

◆ HasReceivedSpectatorResetFor()

bool Player::HasReceivedSpectatorResetFor ( ObjectGuid  guid)
inline

◆ HasRestFlag()

bool Player::HasRestFlag ( RestFlag  restFlag) const
inline
1215{ return (_restFlagMask & restFlag) != 0; }

References _restFlagMask.

Referenced by Update().

◆ HasSkill()

◆ hasSpanishClient()

bool Player::hasSpanishClient ( )
inline
1104 {
1106 }
@ LOCALE_esES
Definition: Common.h:72
@ LOCALE_esMX
Definition: Common.h:73
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:512

References GetSession(), WorldSession::GetSessionDbLocaleIndex(), LOCALE_esES, and LOCALE_esMX.

◆ HasSpell()

bool Player::HasSpell ( uint32  spell) const
overridevirtual

Reimplemented from Unit.

3880{
3881 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3882 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3883}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), AddSpellAndCategoryCooldowns(), LootItem::AllowedForPlayer(), canCreateExtraItems(), CanCreatePerfectItem(), canFlyInZone(), Group::CanJoinBattlegroundQueue(), npc_engineering_tele_trinket::CanLearn(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::EffectCastButtons(), GetExplicitDiscoverySpell(), GetResurrectionSpellId(), GetSkillDiscoverySpell(), GetStartPosition(), GetTrainerSpellState(), WorldSession::HandleBattlemasterJoinOpcode(), Acore::PlayerCommand::HandleLearnSpellCommand(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleTrainerBuySpellOpcode(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), npc_prof_alchemy::HasAlchemySpell(), HasDiscoveredAllSpells(), npc_prof_leather::HasLeatherSpecialty(), go_evil_book_for_dummies::HasLeatherSpecialty(), npc_prof_tailor::HasTailorSpell(), npc_prof_blacksmith::HasWeaponSub(), IsActionButtonDataValid(), Creature::IsValidTrainerForPlayer(), learnQuestRewardedSpells(), boss_gloomrel::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), ProcessCastaction(), resetTalents(), WorldSession::SendTrainerList(), and TeleportTo().

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

bool Player::HasSpellItemCooldown ( uint32  spell_id,
uint32  itemid 
) const
overridevirtual

Reimplemented from Unit.

16281{
16282 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16283 return itr != m_spellCooldowns.end() && itr->second.end > getMSTime() && itr->second.itemid == itemid;
16284}

References getMSTime(), and m_spellCooldowns.

◆ HasSpellMod()

bool Player::HasSpellMod ( SpellModifier mod,
Spell spell 
)
9717{
9718 if (!mod || !spell)
9719 return false;
9720
9721 return spell->m_appliedMods.find(mod->ownerAura) != spell->m_appliedMods.end();
9722}

References Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ HasTalent()

bool Player::HasTalent ( uint32  spell_id,
uint8  spec 
) const
3886{
3887 PlayerTalentMap::const_iterator itr = m_talents.find(spell);
3888 return (itr != m_talents.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3889}

References m_activeSpec, m_talents, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), GetSpec(), AuraEffect::HandleShapeshiftBoosts(), and LearnTalent().

◆ HasTankSpec()

bool Player::HasTankSpec ( )
16010{
16011 switch (GetSpec())
16012 {
16016 return true;
16019 return true;
16020 break;
16021 default:
16022 break;
16023 }
16024 return false;
16025}
@ FORM_DIREBEAR
Definition: UnitDefines.h:77
@ FORM_BEAR
Definition: UnitDefines.h:74
@ TALENT_TREE_DEATH_KNIGHT_BLOOD
Definition: Player.h:160
@ TALENT_TREE_PALADIN_PROTECTION
Definition: Player.h:149
@ TALENT_TREE_WARRIOR_PROTECTION
Definition: Player.h:147

References FORM_BEAR, FORM_DIREBEAR, Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_BLOOD, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_PROTECTION, and TALENT_TREE_WARRIOR_PROTECTION.

◆ HasTitle() [1/2]

bool Player::HasTitle ( CharTitlesEntry const *  title) const
inline
2552{ return HasTitle(title->bit_index); }
bool HasTitle(uint32 bitIndex) const
Definition: Player.cpp:13270

References CharTitlesEntry::bit_index, and HasTitle().

Referenced by HasTitle().

◆ HasTitle() [2/2]

bool Player::HasTitle ( uint32  bitIndex) const
13271{
13272 if (bitIndex > MAX_TITLE_INDEX)
13273 return false;
13274
13275 uint32 fieldIndexOffset = bitIndex / 32;
13276 uint32 flag = 1 << (bitIndex % 32);
13277 return HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13278}
#define MAX_TITLE_INDEX
Definition: Player.h:560

References Object::HasFlag(), MAX_TITLE_INDEX, and PLAYER__FIELD_KNOWN_TITLES.

Referenced by character_commandscript::HandleCharacterTitlesCommand(), lookup_commandscript::HandleLookupTitleCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), LoadFromDB(), and AchievementCriteriaData::Meets().

◆ HasWeapon()

bool Player::HasWeapon ( WeaponAttackType  type) const
inlineoverridevirtual

Implements Unit.

1269{ return GetWeaponForAttack(type, false); }

References GetWeaponForAttack().

◆ HasWeaponForAttack()

bool Player::HasWeaponForAttack ( WeaponAttackType  type) const
inlineoverridevirtual

Reimplemented from Unit.

1270{ return (Unit::HasWeaponForAttack(type) && GetWeaponForAttack(type, true)); }
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition: Unit.h:925

References GetWeaponForAttack(), and Unit::HasWeaponForAttack().

◆ HaveAtClient() [1/2]

bool Player::HaveAtClient ( ObjectGuid  guid) const
11380{
11381 if (guid == GetGUID())
11382 {
11383 return true;
11384 }
11385
11386 return m_clientGUIDs.find(guid) != m_clientGUIDs.end();
11387}
GuidUnorderedSet m_clientGUIDs
Definition: Player.h:2391

References Object::GetGUID(), and m_clientGUIDs.

◆ HaveAtClient() [2/2]

bool Player::HaveAtClient ( WorldObject const *  u) const
11361{
11362 if (u == this)
11363 {
11364 return true;
11365 }
11366
11367 // Motion Transports are always present in player's client
11368 if (GameObject const* gameobject = u->ToGameObject())
11369 {
11370 if (gameobject->IsMotionTransport())
11371 {
11372 return true;
11373 }
11374 }
11375
11376 return m_clientGUIDs.find(u->GetGUID()) != m_clientGUIDs.end();
11377}

References Object::GetGUID(), m_clientGUIDs, and Object::ToGameObject().

Referenced by Group::AddMember(), WorldObjectChangeAccumulator::BuildPacket(), WorldObject::DestroyForNearbyPlayers(), ArenaSpectator::HandleSpectatorWatchCommand(), Map::SendInitSelf(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SetOwnerGUID(), and UpdateVisibilityOf().

◆ InArena()

bool Player::InArena ( ) const
12246{
12248 if (!bg || !bg->isArena())
12249 return false;
12250
12251 return true;
12252}
bool isArena() const
Definition: Battleground.h:404

References GetBattleground(), and Battleground::isArena().

Referenced by CreateCorpse(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleUseItemOpcode(), achievement_arena_by_type::OnCheck(), RewardHonor(), and AuraEffect::UpdatePeriodic().

◆ InBattleground()

◆ InBattlegroundQueue()

bool Player::InBattlegroundQueue ( bool  ignoreArena = false) const

◆ InBattlegroundQueueForBattlegroundQueueType()

bool Player::InBattlegroundQueueForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12188{
12190}
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
Definition: Player.cpp:12169

References GetBattlegroundQueueIndex(), and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by Group::CanJoinBattlegroundQueue(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ IncompleteQuest()

◆ InitDataForForm()

void Player::InitDataForForm ( bool  reapplyMods = false)
10521{
10523
10524 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
10525 if (ssEntry && ssEntry->attackSpeed)
10526 {
10530 }
10531 else
10533
10534 switch (form)
10535 {
10536 case FORM_GHOUL:
10537 case FORM_CAT:
10538 {
10539 if (getPowerType() != POWER_ENERGY)
10541 break;
10542 }
10543 case FORM_BEAR:
10544 case FORM_DIREBEAR:
10545 {
10546 if (getPowerType() != POWER_RAGE)
10548 break;
10549 }
10550 default: // 0, for example
10551 {
10552 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(getClass());
10553 if (cEntry && cEntry->powerType < MAX_POWERS && uint32(getPowerType()) != cEntry->powerType)
10554 setPowerType(Powers(cEntry->powerType));
10555 break;
10556 }
10557 }
10558
10559 // update auras at form change, ignore this at mods reapply (.reset stats/etc) when form not change.
10560 if (!reapplyMods)
10562
10565}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
ShapeshiftForm
Definition: UnitDefines.h:68
@ FORM_GHOUL
Definition: UnitDefines.h:76
void SetRegularAttackTime()
Definition: Player.cpp:5301
void UpdateEquipSpellsAtFormChange()
Definition: PlayerUpdates.cpp:1359
void setPowerType(Powers power)
Definition: Unit.cpp:10019
Definition: DBCStructure.h:1818
uint32 attackSpeed
Definition: DBCStructure.h:1826

References SpellShapeshiftFormEntry::attackSpeed, BASE_ATTACK, BASE_ATTACK_TIME, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_GHOUL, Unit::getClass(), Unit::getPowerType(), Unit::GetShapeshiftForm(), MAX_POWERS, OFF_ATTACK, POWER_ENERGY, POWER_RAGE, ChrClassesEntry::powerType, RANGED_ATTACK, sChrClassesStore, Unit::SetAttackTime(), Unit::setPowerType(), SetRegularAttackTime(), sSpellShapeshiftFormStore, UpdateAttackPowerAndDamage(), and UpdateEquipSpellsAtFormChange().

Referenced by AuraEffect::HandleAuraModShapeshift(), and InitStatsForLevel().

◆ InitDisplayIds()

void Player::InitDisplayIds ( )
10568{
10569 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
10570 if (!info)
10571 {
10572 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Can't init display ids.", GetGUID().ToString());
10573 return;
10574 }
10575
10576 uint8 gender = getGender();
10577 switch (gender)
10578 {
10579 case GENDER_FEMALE:
10582 break;
10583 case GENDER_MALE:
10586 break;
10587 default:
10588 LOG_ERROR("entities.player", "Invalid gender {} for player", gender);
10589 return;
10590 }
10591}
@ GENDER_MALE
Definition: SharedDefines.h:61
@ GENDER_FEMALE
Definition: SharedDefines.h:62
uint16 displayId_m
Definition: Player.h:351
uint16 displayId_f
Definition: Player.h:352
uint8 getGender() const
Definition: Unit.h:798
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition: Unit.cpp:16795
void SetNativeDisplayId(uint32 displayId)
Definition: Unit.h:1882

References PlayerInfo::displayId_f, PlayerInfo::displayId_m, GENDER_FEMALE, GENDER_MALE, Unit::getClass(), Unit::getGender(), Object::GetGUID(), Unit::getRace(), LOG_ERROR, Unit::SetDisplayId(), Unit::SetNativeDisplayId(), sObjectMgr, and Position::ToString().

Referenced by Create(), modify_commandscript::HandleModifyGenderCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), and LoadFromDB().

◆ InitGlyphsForLevel()

void Player::InitGlyphsForLevel ( )
13232{
13233 for (uint32 i = 0; i < sGlyphSlotStore.GetNumRows(); ++i)
13234 if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(i))
13235 if (gs->Order)
13236 SetGlyphSlot(gs->Order - 1, gs->Id);
13237
13238 uint8 level = GetLevel();
13239 uint32 value = 0;
13240
13241 // 0x3F = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 for 80 level
13242 if (level >= 15)
13243 value |= (0x01 | 0x02);
13244 if (level >= 30)
13245 value |= 0x08;
13246 if (level >= 50)
13247 value |= 0x04;
13248 if (level >= 70)
13249 value |= 0x10;
13250 if (level >= 80)
13251 value |= 0x20;
13252
13254}
@ PLAYER_GLYPHS_ENABLED
Definition: UpdateFields.h:390
void SetGlyphSlot(uint8 slot, uint32 slottype)
Definition: Player.h:1765

References Unit::GetLevel(), PLAYER_GLYPHS_ENABLED, SetGlyphSlot(), Unit::SetUInt32Value(), and sGlyphSlotStore.

Referenced by Create(), GiveLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ Initialize()

void Player::Initialize ( ObjectGuid::LowType  guid)
4781{
4782 Object::_Create(guid, 0, HighGuid::Player);
4783}

References Object::_Create().

◆ InitPrimaryProfessions()

void Player::InitPrimaryProfessions ( )
11459{
11461}
@ CONFIG_MAX_PRIMARY_TRADE_SKILL
Definition: IWorld.h:252

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SetFreePrimaryProfessions(), and sWorld.

Referenced by Create(), and LoadFromDB().

◆ InitRunes()

void Player::InitRunes ( )
13402{
13404 return;
13405
13406 m_runes = new Runes;
13407
13408 m_runes->runeState = 0;
13410
13411 for (uint8 i = 0; i < MAX_RUNES; ++i)
13412 {
13413 SetBaseRune(i, runeSlotTypes[i]); // init base types
13414 SetCurrentRune(i, runeSlotTypes[i]); // init current types
13415 SetRuneCooldown(i, 0); // reset cooldowns
13416 SetGracePeriod(i, 0); // xinef: reset grace period
13417 SetRuneConvertAura(i, nullptr);
13419 }
13420
13421 for (uint8 i = 0; i < NUM_RUNE_TYPES; ++i)
13423}
@ PLAYER_RUNE_REGEN_1
Definition: UpdateFields.h:386
@ NUM_RUNE_TYPES
Definition: Player.h:419
@ RUNE_BLOOD
Definition: Player.h:415
#define MAX_RUNES
Definition: Player.h:404
static RuneType runeSlotTypes[MAX_RUNES]
Definition: Player.cpp:13391
Definition: Player.h:432
void SetRuneState(uint8 index, bool set=true)
Definition: Player.h:437
void SetRuneCooldown(uint8 index, uint32 cooldown)
Definition: Player.h:2526
void SetBaseRune(uint8 index, RuneType baseRune)
Definition: Player.h:2524
void SetGracePeriod(uint8 index, uint32 period)
Definition: Player.h:2527

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, IsClass(), Runes::lastUsedRune, m_runes, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, RUNE_BLOOD, runeSlotTypes, Runes::runeState, SetBaseRune(), SetCurrentRune(), Object::SetFloatValue(), SetGracePeriod(), SetRuneConvertAura(), SetRuneCooldown(), and Runes::SetRuneState().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitStatsForLevel()

void Player::InitStatsForLevel ( bool  reapplyMods = false)
2583{
2584 if (reapplyMods) //reapply stats values only on .reset stats (level) command
2586
2587 PlayerClassLevelInfo classInfo;
2588 sObjectMgr->GetPlayerClassLevelInfo(getClass(), GetLevel(), &classInfo);
2589
2590 PlayerLevelInfo info;
2591 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), GetLevel(), &info);
2592
2593 uint32 maxPlayerLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
2594 sScriptMgr->OnPlayerSetMaxLevel(this, maxPlayerLevel);
2595 SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, maxPlayerLevel);
2597
2598 // reset before any aura state sources (health set/aura apply)
2600
2602
2603 // set default cast time multiplier
2605
2606 // reset size before reapply auras
2607 SetObjectScale(1.0f);
2608
2609 // save base values (bonuses already included in stored stats
2610 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2611 SetCreateStat(Stats(i), info.stats[i]);
2612
2613 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2614 SetStat(Stats(i), info.stats[i]);
2615
2616 SetCreateHealth(classInfo.basehealth);
2617
2618 //set create powers
2619 SetCreateMana(classInfo.basemana);
2620
2622
2624
2625 //reset rating fields values
2627 SetUInt32Value(index, 0);
2628
2630 for (uint8 i = 0; i < 7; ++i)
2631 {
2635 }
2636
2637 //reset attack power, damage and attack speed fields
2639 SetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1, 2000.0f); // offhand attack time
2641
2648
2655
2656 // Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2660
2661 // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2662 for (uint8 i = 0; i < 7; ++i)
2664
2668
2669 // Dodge percentage
2671
2672 // set armor (resistance 0) to original value (create_agility*2)
2674 SetResistanceBuffMods(SpellSchools(0), true, 0.0f);
2675 SetResistanceBuffMods(SpellSchools(0), false, 0.0f);
2676 // set other resistance to original value (0)
2677 for (uint8 i = 1; i < MAX_SPELL_SCHOOL; ++i)
2678 {
2680 SetResistanceBuffMods(SpellSchools(i), true, 0.0f);
2681 SetResistanceBuffMods(SpellSchools(i), false, 0.0f);
2682 }
2683
2686 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
2687 {
2690 }
2691 // Reset no reagent cost field
2692 for (uint8 i = 0; i < 3; ++i)
2694 // Init data for form but skip reapply item mods for form
2695 InitDataForForm(reapplyMods);
2696
2697 // save new stats
2698 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
2700
2701 SetMaxHealth(classInfo.basehealth); // stamina bonus will applied later
2702
2703 // cleanup mounted state (it will set correctly at aura loading if player saved at mount.
2705
2706 // cleanup unit flags (will be re-applied if need at aura load).
2714 SetImmuneToAll(false);
2716
2718
2719 // cleanup player flags (will be re-applied if need at aura load), to avoid have ghost flag without ghost aura, for example.
2721
2722 RemoveStandFlags(UNIT_STAND_FLAGS_ALL); // one form stealth modified bytes
2724 {
2726 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
2727
2728 }
2729 // restore if need some important flags
2730 SetUInt32Value(PLAYER_FIELD_BYTES2, 0); // flags empty by default
2731
2732 if (reapplyMods) // reapply stats values only on .reset stats (level) command
2734
2735 // set current level health and mana/energy to maximum after applying all mods.
2736 SetFullHealth();
2744
2745 // update level to hunter/summon pet
2746 if (Pet* pet = GetPet())
2747 pet->SynchronizeLevelWithOwner();
2748}
@ UNIT_FIELD_MINDAMAGE
Definition: UpdateFields.h:127
@ UNIT_FIELD_POWER_COST_MODIFIER
Definition: UpdateFields.h:170
@ UNIT_FIELD_RANGEDATTACKTIME
Definition: UpdateFields.h:121
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition: UpdateFields.h:163
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition: UpdateFields.h:353
@ PLAYER_SHIELD_BLOCK
Definition: UpdateFields.h:355
@ UNIT_FIELD_MAXDAMAGE
Definition: UpdateFields.h:128
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:167
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition: UpdateFields.h:130
@ PLAYER_FIELD_BYTES2
Definition: UpdateFields.h:378
@ UNIT_FIELD_AURASTATE
Definition: UpdateFields.h:119
@ UNIT_FIELD_MOUNTDISPLAYID
Definition: UpdateFields.h:126
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition: UpdateFields.h:169
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:164
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition: UpdateFields.h:168
@ UNIT_FIELD_FLAGS
Definition: UpdateFields.h:117
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition: UpdateFields.h:166
@ PLAYER_FIELD_MOD_DAMAGE_DONE_PCT
Definition: UpdateFields.h:362
@ UNIT_FIELD_POWER_COST_MULTIPLIER
Definition: UpdateFields.h:171
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition: UpdateFields.h:129
@ PLAYER_FIELD_MAX_LEVEL
Definition: UpdateFields.h:384
@ UNIT_FIELD_BASEATTACKTIME
Definition: UpdateFields.h:120
@ PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE
Definition: UpdateFields.h:367
@ UNIT_STAND_FLAGS_ALL
Definition: UnitDefines.h:52
@ UNIT_BYTE2_FLAG_FFA_PVP
Definition: UnitDefines.h:138
@ UNIT_BYTE2_FLAG_SANCTUARY
Definition: UnitDefines.h:139
@ UNIT_FLAG_STUNNED
Definition: UnitDefines.h:268
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:251
@ UNIT_FLAG_IN_COMBAT
Definition: UnitDefines.h:269
@ UNIT_FLAG_DISARMED
Definition: UnitDefines.h:271
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:267
@ UNIT_FLAG_CONFUSED
Definition: UnitDefines.h:272
@ UNIT_FLAG_FLEEING
Definition: UnitDefines.h:273
@ UNIT_FLAG_NOT_SELECTABLE
Definition: UnitDefines.h:275
@ UNIT_FLAG_LOOTING
Definition: UnitDefines.h:260
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: UnitDefines.h:257
@ UNIT_FLAG_SILENCED
Definition: UnitDefines.h:263
@ UNIT_FLAG_MOUNT
Definition: UnitDefines.h:277
@ UNIT_FLAG_PET_IN_COMBAT
Definition: UnitDefines.h:261
@ PLAYER_ALLOW_ONLY_ABILITY
Definition: Player.h:503
@ PLAYER_FLAGS_DND
Definition: Player.h:482
@ PLAYER_FLAGS_AFK
Definition: Player.h:481
@ PLAYER_FLAGS_GM
Definition: Player.h:483
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:930
void _ApplyAllStatBonuses()
Definition: StatSystem.cpp:991
void InitDataForForm(bool reapplyMods=false)
Definition: Player.cpp:10520
void _RemoveAllStatBonuses()
Definition: StatSystem.cpp:1003
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15697
void SetStat(Stats stat, int32 val)
Definition: Unit.h:996
void SetResistanceBuffMods(SpellSchools school, bool positive, float val)
Definition: Unit.h:1124
float m_createStats[MAX_STATS]
Definition: Unit.h:2052
void SetResistance(SpellSchools school, int32 val)
Definition: Unit.h:1123
void RemoveStandFlags(uint8 flags)
Definition: Unit.h:1692
void SetArmor(int32 val)
Definition: Unit.h:1080
void SetMaxHealth(uint32 val)
Definition: Unit.cpp:15579
void InitStatBuffMods()
Definition: Unit.h:1006
void SetImmuneToAll(bool apply, bool keepCombat=false)
Definition: Unit.h:867

References _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CONFIG_MAX_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreatePowers(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Object::HasByteFlag(), InitDataForForm(), Unit::InitStatBuffMods(), Unit::m_createStats, MAX_COMBAT_RATING, MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_ALLOW_ONLY_ABILITY, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_BYTES2, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_FIELD_MAX_LEVEL, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE, PLAYER_FIELD_MOD_TARGET_RESISTANCE, PLAYER_FLAGS_AFK, PLAYER_FLAGS_DND, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_GM, PLAYER_NEXT_LEVEL_XP, PLAYER_NO_REAGENT_COST_1, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SHIELD_BLOCK, PLAYER_SPELL_CRIT_PERCENTAGE1, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Object::RemoveByteFlag(), Object::RemoveFlag(), RemovePlayerFlag(), Unit::RemoveStandFlags(), Unit::SetArmor(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Object::SetFloatValue(), Unit::SetFullHealth(), Unit::SetImmuneToAll(), Object::SetInt32Value(), Unit::SetMaxHealth(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetResistance(), Unit::SetResistanceBuffMods(), Unit::SetStat(), Unit::SetUInt32Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), sObjectMgr, sScriptMgr, STAT_AGILITY, STAT_STRENGTH, PlayerLevelInfo::stats, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_FLAGS, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FIELD_POWER_COST_MODIFIER, UNIT_FIELD_POWER_COST_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_CONFUSED, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_DISARMED, UNIT_FLAG_FLEEING, UNIT_FLAG_IN_COMBAT, UNIT_FLAG_LOOTING, UNIT_FLAG_MOUNT, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PACIFIED, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_SILENCED, UNIT_FLAG_SKINNABLE, UNIT_FLAG_STUNNED, UNIT_FLAG_TAXI_FLIGHT, UNIT_MOD_CAST_SPEED, UNIT_STAND_FLAGS_ALL, and UpdateSkillsForLevel().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitTalentForLevel()

void Player::InitTalentForLevel ( )
2568{
2569 uint32 talentPointsForLevel = CalculateTalentsPoints();
2570
2571 // xinef: more talent points that we have are used, reset
2572 if (m_usedTalentCount > talentPointsForLevel)
2573 resetTalents(true);
2574 // xinef: else, recalculate free talent points count
2575 else
2576 SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
2577
2578 if (!GetSession()->PlayerLoading())
2579 SendTalentsInfoData(false); // update at client
2580}
void SendTalentsInfoData(bool pet)
Definition: Player.cpp:14364
bool resetTalents(bool noResetCost=false)
Definition: Player.cpp:3704
void SetFreeTalentPoints(uint32 points)
Definition: Player.cpp:3799
uint32 CalculateTalentsPoints() const
Definition: Player.cpp:13564

References CalculateTalentsPoints(), GetSession(), m_usedTalentCount, resetTalents(), SendTalentsInfoData(), and SetFreeTalentPoints().

Referenced by ActivateSpec(), Create(), GiveLevel(), character_commandscript::HandleCharacterLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), LoadFromDB(), and RewardQuest().

◆ InitTaxiNodesForLevel()

void Player::InitTaxiNodesForLevel ( )
inline

◆ inRandomLfgDungeon()

bool Player::inRandomLfgDungeon ( )
13019{
13020 if (sLFGMgr->selectedRandomLfgDungeon(GetGUID()))
13021 {
13022 Map const* map = GetMap();
13023 return sLFGMgr->inLfgDungeonMap(GetGUID(), map->GetId(), map->GetDifficulty());
13024 }
13025
13026 return false;
13027}

References Map::GetDifficulty(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), and sLFGMgr.

◆ isAcceptWhispers()

bool Player::isAcceptWhispers ( ) const
inline

◆ IsActionButtonDataValid()

bool Player::IsActionButtonDataValid ( uint8  button,
uint32  action,
uint8  type 
)
5588{
5589 if (button >= MAX_ACTION_BUTTONS)
5590 {
5591 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: button must be < {}", action, button, GetName(), MAX_ACTION_BUTTONS);
5592 return false;
5593 }
5594
5595 if (action >= MAX_ACTION_BUTTON_ACTION_VALUE)
5596 {
5597 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: action must be < {}", action, button, GetName(), MAX_ACTION_BUTTON_ACTION_VALUE);
5598 return false;
5599 }
5600
5601 switch (type)
5602 {
5604 if (!sSpellMgr->GetSpellInfo(action))
5605 {
5606 LOG_ERROR("entities.player", "Spell action {} not added into button {} for player {}: spell not exist", action, button, GetName());
5607 return false;
5608 }
5609
5610 if (!HasSpell(action))
5611 {
5612 LOG_DEBUG("entities.player.loading", "Player::IsActionButtonDataValid Spell action {} not added into button {} for player {}: player don't known this spell", action, button, GetName());
5613 return false;
5614 }
5615 break;
5616 case ACTION_BUTTON_ITEM:
5617 if (!sObjectMgr->GetItemTemplate(action))
5618 {
5619 LOG_ERROR("entities.player", "Item action {} not added into button {} for player {}: item not exist", action, button, GetName());
5620 return false;
5621 }
5622 break;
5623 default:
5624 break; // other cases not checked at this moment
5625 }
5626
5627 return true;
5628}
@ ACTION_BUTTON_ITEM
Definition: Player.h:235
@ ACTION_BUTTON_SPELL
Definition: Player.h:230
#define MAX_ACTION_BUTTONS
Definition: Player.h:280
#define MAX_ACTION_BUTTON_ACTION_VALUE
Definition: Player.h:256

References ACTION_BUTTON_ITEM, ACTION_BUTTON_SPELL, WorldObject::GetName(), HasSpell(), LOG_DEBUG, LOG_ERROR, MAX_ACTION_BUTTON_ACTION_VALUE, MAX_ACTION_BUTTONS, sObjectMgr, and sSpellMgr.

Referenced by addActionButton().

◆ IsActiveQuest()

bool Player::IsActiveQuest ( uint32  quest_id) const
203{
204 return m_QuestStatus.find(quest_id) != m_QuestStatus.end();
205}

References m_QuestStatus.

◆ IsAffectedBySpellmod()

bool Player::IsAffectedBySpellmod ( SpellInfo const *  spellInfo,
SpellModifier mod,
Spell spell = nullptr 
)
9725{
9726 if (!mod || !spellInfo)
9727 return false;
9728
9729 // Mod out of charges
9730 if (spell && mod->charges == -1 && spell->m_appliedMods.find(mod->ownerAura) == spell->m_appliedMods.end())
9731 return false;
9732
9733 // +duration to infinite duration spells making them limited
9734 if (mod->op == SPELLMOD_DURATION && spellInfo->GetDuration() == -1)
9735 return false;
9736
9737 return spellInfo->IsAffectedBySpellMod(mod);
9738}

References SpellModifier::charges, SpellInfo::GetDuration(), SpellInfo::IsAffectedBySpellMod(), Spell::m_appliedMods, SpellModifier::op, SpellModifier::ownerAura, and SPELLMOD_DURATION.

Referenced by ApplySpellMod().

◆ isAFK()

◆ isAllowedToLoot()

bool Player::isAllowedToLoot ( Creature const *  creature)
5621{
5622 if (!creature->isDead() || !creature->IsDamageEnoughForLootingAndReward() || creature->IsLootRewardDisabled())
5623 return false;
5624
5625 if (HasPendingBind())
5626 return false;
5627
5628 const Loot* loot = &creature->loot;
5629 if (loot->isLooted()) // nothing to loot or everything looted.
5630 return false;
5631
5632 if (!loot->hasItemForAll() && !loot->hasItemFor(this)) // no loot in creature for this player
5633 return false;
5634
5635 if (loot->loot_type == LOOT_SKINNING)
5636 return creature->GetLootRecipientGUID() == GetGUID();
5637
5638 Group* thisGroup = GetGroup();
5639 if (!thisGroup)
5640 return this == creature->GetLootRecipient();
5641 else if (thisGroup != creature->GetLootRecipientGroup())
5642 return false;
5643
5644 switch (thisGroup->GetLootMethod())
5645 {
5646 case MASTER_LOOT:
5647 case FREE_FOR_ALL:
5648 return true;
5649 case ROUND_ROBIN:
5650 // may only loot if the player is the loot roundrobin player
5651 // or if there are free/quest/conditional item for the player
5652 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5653 return true;
5654
5655 return loot->hasItemFor(this);
5656 case GROUP_LOOT:
5657 case NEED_BEFORE_GREED:
5658 // may only loot if the player is the loot roundrobin player
5659 // or item over threshold (so roll(s) can be launched)
5660 // or if there are free/quest/conditional item for the player
5661 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5662 return true;
5663
5664 if (loot->hasOverThresholdItem())
5665 return true;
5666
5667 return loot->hasItemFor(this);
5668 }
5669
5670 return false;
5671}
@ NEED_BEFORE_GREED
Definition: LootMgr.h:62
@ GROUP_LOOT
Definition: LootMgr.h:61
@ MASTER_LOOT
Definition: LootMgr.h:60
@ ROUND_ROBIN
Definition: LootMgr.h:59
@ FREE_FOR_ALL
Definition: LootMgr.h:58
@ LOOT_SKINNING
Definition: LootMgr.h:85
bool HasPendingBind() const
Definition: Player.h:2449
LootMethod GetLootMethod() const
Definition: Group.cpp:2315
bool hasItemFor(Player *player) const
Definition: LootMgr.cpp:936
bool isLooted() const
Definition: LootMgr.h:368
bool hasOverThresholdItem() const
Definition: LootMgr.cpp:981
ObjectGuid roundRobinPlayer
Definition: LootMgr.h:324
bool hasItemForAll() const
Definition: LootMgr.cpp:921
LootType loot_type
Definition: LootMgr.h:326

References FREE_FOR_ALL, GetGroup(), Object::GetGUID(), Group::GetLootMethod(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GROUP_LOOT, Loot::hasItemFor(), Loot::hasItemForAll(), Loot::hasOverThresholdItem(), HasPendingBind(), Creature::IsDamageEnoughForLootingAndReward(), Unit::isDead(), Loot::isLooted(), Creature::IsLootRewardDisabled(), Creature::loot, LOOT_SKINNING, Loot::loot_type, MASTER_LOOT, NEED_BEFORE_GREED, ROUND_ROBIN, and Loot::roundRobinPlayer.

Referenced by Unit::PatchValuesUpdate().

◆ IsAlwaysDetectableFor()

bool Player::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11414{
11416 return true;
11417
11418 if (duel && duel->State != DUEL_STATE_CHALLENGED && duel->Opponent == seer)
11419 {
11420 return false;
11421 }
11422
11423 if (Player const* seerPlayer = seer->ToPlayer())
11424 {
11425 if (IsGroupVisibleFor(seerPlayer))
11426 {
11427 return true;
11428 }
11429 }
11430
11431 return false;
11432}
@ DUEL_STATE_CHALLENGED
Definition: Player.h:376
bool IsGroupVisibleFor(Player const *p) const
Definition: Player.cpp:2303
bool IsAlwaysDetectableFor(WorldObject const *seer) const override
Definition: Unit.cpp:14265

References duel, DUEL_STATE_CHALLENGED, Unit::IsAlwaysDetectableFor(), IsGroupVisibleFor(), and Object::ToPlayer().

◆ IsAtGroupRewardDistance()

bool Player::IsAtGroupRewardDistance ( WorldObject const *  pRewardSource) const
12708{
12709 WorldObject const* player = GetCorpse();
12710 if (!player || IsAlive())
12711 {
12712 player = this;
12713 }
12714
12715 if (!pRewardSource || !player->IsInMap(pRewardSource))
12716 {
12717 return false;
12718 }
12719
12720 if (pRewardSource->GetMap()->IsDungeon())
12721 {
12722 return true;
12723 }
12724
12725 return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE);
12726}
@ CONFIG_GROUP_XP_DISTANCE
Definition: IWorld.h:189
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1256

References CONFIG_GROUP_XP_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetMap(), Unit::IsAlive(), Map::IsDungeon(), WorldObject::IsInMap(), and sWorld.

Referenced by KillRewarder::_InitGroupData(), KillRewarder::_RewardGroup(), SmartAI::EndPath(), GroupEventHappens(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), IsAtLootRewardDistance(), Group::NeedBeforeGreed(), RewardPlayerAndGroupAtEvent(), and npc_custodian_of_time::npc_custodian_of_timeAI::WaypointReached().

◆ IsAtLootRewardDistance()

bool Player::IsAtLootRewardDistance ( WorldObject const *  pRewardSource) const
12729{
12730 if (!IsAtGroupRewardDistance(pRewardSource))
12731 {
12732 return false;
12733 }
12734
12735 if (HasPendingBind())
12736 {
12737 return false;
12738 }
12739
12740 return pRewardSource->HasAllowedLooter(GetGUID());
12741}

References Object::GetGUID(), WorldObject::HasAllowedLooter(), HasPendingBind(), and IsAtGroupRewardDistance().

Referenced by Loot::FillLoot(), Group::GroupLoot(), WorldSession::HandleLootMoneyOpcode(), Group::MasterLoot(), and Group::UpdateLooterGuid().

◆ IsAtRecruitAFriendDistance()

bool Player::IsAtRecruitAFriendDistance ( WorldObject const *  pOther) const
12744{
12745 if (!pOther)
12746 return false;
12747 WorldObject const* player = GetCorpse();
12748 if (!player || IsAlive())
12749 player = this;
12750
12751 if (player->GetMapId() != pOther->GetMapId() || player->GetInstanceId() != pOther->GetInstanceId())
12752 return false;
12753
12754 return pOther->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE);
12755}
@ CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE
Definition: IWorld.h:190

References CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::IsAlive(), and sWorld.

Referenced by GetsRecruitAFriendBonus().

◆ IsBagPos()

bool Player::IsBagPos ( uint16  pos)
static

◆ IsBankPos() [1/2]

◆ IsBankPos() [2/2]

bool Player::IsBankPos ( uint8  bag,
uint8  slot 
)
static
580{
581 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END))
582 return true;
583 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END))
584 return true;
585 if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
586 return true;
587 return false;
588}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, and INVENTORY_SLOT_BAG_0.

◆ IsBaseRuneSlotsOnCooldown()

bool Player::IsBaseRuneSlotsOnCooldown ( RuneType  runeType) const
13426{
13427 for (uint8 i = 0; i < MAX_RUNES; ++i)
13428 if (GetBaseRune(i) == runeType && GetRuneCooldown(i) == 0)
13429 return false;
13430
13431 return true;
13432}
uint32 GetRuneCooldown(uint8 index) const
Definition: Player.h:2518

References GetBaseRune(), GetRuneCooldown(), and MAX_RUNES.

Referenced by Unit::HandleProcTriggerSpell().

◆ isBeingLoaded()

bool Player::isBeingLoaded ( ) const
overridevirtual

Reimplemented from Unit.

4914{
4915 return GetSession()->PlayerLoading();
4916}
bool PlayerLoading() const
Definition: WorldSession.h:337

References GetSession(), and WorldSession::PlayerLoading().

Referenced by _addSpell(), addTalent(), MapInstanced::CreateInstanceForPlayer(), SendInitialPacketsAfterAddToMap(), SetHonorPoints(), SetMover(), and UpdateObjectVisibility().

◆ IsBeingTeleported()

◆ IsBeingTeleportedFar()

bool Player::IsBeingTeleportedFar ( ) const
inline

◆ IsBeingTeleportedNear()

bool Player::IsBeingTeleportedNear ( ) const
inline

◆ IsClass()

bool Player::IsClass ( Classes  playerClass,
ClassContext  context = CLASS_CONTEXT_NONE 
) const
overridevirtual

Reimplemented from Unit.

1290{
1291 Optional<bool> scriptResult = sScriptMgr->OnPlayerIsClass(this, unitClass, context);
1292 if (scriptResult != std::nullopt)
1293 return *scriptResult;
1294 else
1295 return (getClass() == unitClass);
1296}

References Unit::getClass(), and sScriptMgr.

Referenced by _ApplyItemBonuses(), ActivateSpec(), ActivateTaxiPathTo(), ApplyEnchantment(), CalculateTalentsPoints(), Group::CanJoinBattlegroundQueue(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::CheckRuneCost(), Create(), WorldSession::DoLootRelease(), DuelComplete(), Spell::EffectActivateRune(), Spell::EffectSummonPet(), EquipItem(), spell_class_call_handler::FilterTargets(), FindEquipSlot(), Graveyard::GetClosestGraveyard(), GetNPCIfCanInteractWith(), spell_gen_on_tournament_mount::GetPennatSpellId(), GetStartPosition(), AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), spell_item_refocus::HandleDummy(), WorldSession::HandleLootMoneyOpcode(), AuraEffect::HandlePeriodicDummyAuraTick(), Unit::HandleProcTriggerSpell(), reset_commandscript::HandleResetLevelCommand(), spell_gen_pet_summoned::HandleScript(), ArenaSpectator::HandleSpectatorSpectateCommand(), InitRunes(), Creature::isCanTrainingAndResetTalentsOf(), Pet::IsPermanentPetFor(), Creature::IsValidTrainerForPlayer(), LearnDefaultSkill(), Pet::LoadPetFromDB(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), PrepareGossipMenu(), RegenerateAll(), TeleportTo(), UpdateAttackPowerAndDamage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ IsCommentator()

bool Player::IsCommentator ( ) const
inline
@ PLAYER_FLAGS_COMMENTATOR2
Definition: Player.h:502

References HasPlayerFlag(), and PLAYER_FLAGS_COMMENTATOR2.

Referenced by GetChatTag(), and misc_commandscript::HandleCommentatorCommand().

◆ IsCurrentBattlegroundRandom()

bool Player::IsCurrentBattlegroundRandom ( ) const
inline
2268{ return m_bgData.bgIsRandom; }
bool bgIsRandom
Definition: Player.h:1046

References BGData::bgIsRandom, and m_bgData.

◆ IsDailyQuestDone()

bool Player::IsDailyQuestDone ( uint32  quest_id)
12065{
12066 if (sObjectMgr->GetQuestTemplate(quest_id))
12067 {
12068 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12069 {
12070 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx) == quest_id)
12071 {
12072 return true;
12073 }
12074 }
12075 }
12076
12077 return false;
12078}

References Object::GetUInt32Value(), PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and sObjectMgr.

◆ IsDeserter()

bool Player::IsDeserter ( ) const
inline
2274{ return HasAura(26013); }

References Unit::HasAura().

◆ IsDeveloper()

bool Player::IsDeveloper ( ) const
inline
@ PLAYER_FLAGS_DEVELOPER
Definition: Player.h:495

References HasPlayerFlag(), and PLAYER_FLAGS_DEVELOPER.

Referenced by GetChatTag(), and misc_commandscript::HandleDevCommand().

◆ isDND()

◆ IsEquipmentPos() [1/2]

◆ IsEquipmentPos() [2/2]

bool Player::IsEquipmentPos ( uint8  bag,
uint8  slot 
)
static
571{
572 if (bag == INVENTORY_SLOT_BAG_0 && (slot < EQUIPMENT_SLOT_END))
573 return true;
575 return true;
576 return false;
577}

References EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, and INVENTORY_SLOT_BAG_START.

◆ IsExistPet()

bool Player::IsExistPet ( )
9208{
9209 PetStable* const petStable = GetPetStable();
9210 return petStable && (petStable->CurrentPet || petStable->GetUnslottedHunterPet());
9211}

References PetStable::CurrentPet, GetPetStable(), and PetStable::GetUnslottedHunterPet().

Referenced by CreatePet(), npc_commandscript::HandleNpcTameCommand(), and pet_commandscript::HandlePetCreateCommand().

◆ IsFalling()

bool Player::IsFalling ( ) const
2165{
2166 // Xinef: Added !IsInFlight check
2167 return GetPositionZ() < m_lastFallZ && !IsInFlight();
2168}

References Position::GetPositionZ(), Unit::IsInFlight(), and m_lastFallZ.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsFFAPvP()

bool Player::IsFFAPvP ( )
16162{
16163 bool result = Unit::IsFFAPvP();
16164
16165 sScriptMgr->OnPlayerIsFFAPvP(this, result);
16166
16167 return result;
16168}
bool IsFFAPvP() const
Definition: Unit.h:982

References Unit::IsFFAPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), WorldSession::HandleRequestPartyMemberStatsOpcode(), RewardHonor(), UpdateFFAPvPFlag(), and UpdateFFAPvPState().

◆ IsGameMaster()

bool Player::IsGameMaster ( ) const
inline
1176{ return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
@ PLAYER_EXTRA_GM_ON
Definition: Player.h:591

References m_ExtraFlags, and PLAYER_EXTRA_GM_ON.

Referenced by ThreatMgr::_addThreat(), Group::_homebindIfInstance(), Unit::_IsValidAssistTarget(), Unit::_IsValidAttackTarget(), Unit::Attack(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), InstanceMap::CannotEnter(), CanTameExoticPets(), Spell::CheckCast(), CheckInstanceLoginValid(), SpellInfo::CheckTarget(), AchievementMgr::CompletedAchievement(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), spell_class_call_polymorph::FilterTargets(), GetPhaseMaskForSpawn(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattlemasterJoinOpcode(), HandleFall(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInspectOpcode(), WorldSession::HandleMessagechatOpcode(), mmaps_commandscript::HandleMmapPathCommand(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), tele_commandscript::HandleTeleCommand(), IsValidCombatTarget(), ThreatCalcHelper::isValidProcess(), boss_felblood_kaelthas::LapseAction(), WorldSession::LogoutPlayer(), MailSender::MailSender(), boss_nalorakk::MoveInLineOfSight(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_ouro_spawner::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_barnes::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), at_trigger_the_beast_movement::OnTrigger(), at_the_beast_room::OnTrigger(), at_ancient_leaf::OnTrigger(), at_lady_deathwhisper_entrance::OnTrigger(), at_icc_gauntlet_event::OnTrigger(), at_icc_putricide_trap::OnTrigger(), at_hor_shadow_throne::OnTrigger(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Unit::PatchValuesUpdate(), MapMgr::PlayerCannotEnter(), Unit::ProcessTerrainStatusUpdate(), Battleground::RemovePlayerAtLeave(), boss_kologarn_pit_kill_bunny::Reset(), AchievementMgr::ResetAchievementCriteria(), Satisfy(), npc_minigob_manabonk::SelectTargetInDalaran(), WorldSession::SendListInventory(), Spell::SendLoot(), SetIsSpectator(), Unit::TauntApply(), Unit::TauntFadeOut(), TeleportTo(), ToggleAFK(), AchievementMgr::UpdateAchievementCriteria(), boss_nefarian::UpdateAI(), UpdateFFAPvPState(), UpdateHomebindTime(), and Whisper().

◆ isGMChat()

bool Player::isGMChat ( ) const
inline
@ PLAYER_EXTRA_GM_CHAT
Definition: Player.h:595

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by GetChatTag().

◆ isGMVisible()

bool Player::isGMVisible ( ) const
inline
@ PLAYER_EXTRA_GM_INVISIBLE
Definition: Player.h:594

References m_ExtraFlags, and PLAYER_EXTRA_GM_INVISIBLE.

Referenced by gm_commandscript::HandleGMVisibleCommand(), and Channel::Invite().

◆ IsGroupVisibleFor()

bool Player::IsGroupVisibleFor ( Player const *  p) const
2304{
2305 switch (sWorld->getIntConfig(CONFIG_GROUP_VISIBILITY))
2306 {
2307 default:
2308 return IsInSameGroupWith(p);
2309 case 1:
2310 return IsInSameRaidWith(p);
2311 case 2:
2312 return GetTeamId() == p->GetTeamId();
2313 }
2314}
@ CONFIG_GROUP_VISIBILITY
Definition: IWorld.h:262
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1894
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2316

References CONFIG_GROUP_VISIBILITY, GetTeamId(), IsInSameGroupWith(), IsInSameRaidWith(), and sWorld.

Referenced by IsAlwaysDetectableFor().

◆ isHonorOrXPTarget()

bool Player::isHonorOrXPTarget ( Unit victim) const
12618{
12619 uint8 v_level = victim->GetLevel();
12621
12622 // Victim level less gray level
12623 if (v_level <= k_grey)
12624 return false;
12625
12626 if (victim->IsCreature())
12627 if (victim->IsTotem() || victim->IsCritter() || victim->IsPet() || victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_XP))
12628 return false;
12629
12630 return true;
12631}
@ CREATURE_FLAG_EXTRA_NO_XP
Definition: CreatureData.h:51
bool HasFlagsExtra(uint32 flag) const
Definition: Creature.h:73
bool IsCritter() const
Definition: Unit.h:783
bool IsTotem() const
Definition: Unit.h:749

References CREATURE_FLAG_EXTRA_NO_XP, Acore::XP::GetGrayLevel(), Unit::GetLevel(), Creature::HasFlagsExtra(), Object::IsCreature(), Unit::IsCritter(), Unit::IsPet(), Unit::IsTotem(), and Object::ToCreature().

Referenced by spell_warl_drain_soul::HandleTick(), Unit::IsTriggeredAtSpellProcEvent(), achievement_killed_exp_or_honor_target::OnCheck(), RaiseDeadCheck::operator()(), spell_warl_drain_soul::RemoveEffect(), and spell_warl_shadowburn::RemoveEffect().

◆ IsImmuneToEnvironmentalDamage()

bool Player::IsImmuneToEnvironmentalDamage ( )
755{
756 // check for GM and death state included in isAttackableByAOE
757 return (!isTargetableForAttack(false, nullptr)) || isTotalImmune();
758}
bool isTargetableForAttack(bool checkFakeDeath=true, Unit const *byWho=nullptr) const
Definition: Unit.cpp:13905

References Unit::isTargetableForAttack(), and isTotalImmune().

Referenced by EnvironmentalDamage().

◆ IsInAreaTriggerRadius()

bool Player::IsInAreaTriggerRadius ( AreaTrigger const *  trigger,
float  delta = 0.f 
) const
2192{
2193 if (!trigger || GetMapId() != trigger->map)
2194 return false;
2195
2196 if (trigger->radius > 0)
2197 {
2198 // if we have radius check it
2199 float dist = GetDistance(trigger->x, trigger->y, trigger->z);
2200 if (dist > trigger->radius + delta)
2201 return false;
2202 }
2203 else
2204 {
2205 Position center(trigger->x, trigger->y, trigger->z, trigger->orientation);
2206 if (!IsWithinBox(center, trigger->length / 2 + delta, trigger->width / 2 + delta, trigger->height / 2 + delta))
2207 return false;
2208 }
2209
2210 return true;
2211}
Definition: Position.h:27
bool IsWithinBox(const Position &center, float xradius, float yradius, float zradius) const
Definition: Position.cpp:111

References WorldObject::GetDistance(), WorldLocation::GetMapId(), AreaTrigger::height, Position::IsWithinBox(), AreaTrigger::length, AreaTrigger::map, AreaTrigger::orientation, AreaTrigger::radius, AreaTrigger::width, AreaTrigger::x, AreaTrigger::y, and AreaTrigger::z.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Update().

◆ IsInSameGroupWith()

bool Player::IsInSameGroupWith ( Player const *  p) const
2317{
2318 return p == this || (GetGroup() &&
2319 GetGroup() == p->GetGroup() &&
2320 GetGroup()->SameSubGroup(this, p));
2321}
bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const
Definition: Group.cpp:2362

References GetGroup(), and Group::SameSubGroup().

Referenced by IsGroupVisibleFor(), and Unit::IsInPartyWith().

◆ IsInSameRaidWith()

◆ IsInventoryPos() [1/2]

◆ IsInventoryPos() [2/2]

bool Player::IsInventoryPos ( uint8  bag,
uint8  slot 
)
static
558{
559 if (bag == INVENTORY_SLOT_BAG_0 && slot == NULL_SLOT)
560 return true;
562 return true;
564 return true;
565 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END))
566 return true;
567 return false;
568}

References CURRENCYTOKEN_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and NULL_SLOT.

◆ IsInvitedForBattlegroundInstance() [1/2]

bool Player::IsInvitedForBattlegroundInstance ( ) const
inline
2267{ return m_bgData.isInvited; }
bool isInvited
Definition: Player.h:1045

References BGData::isInvited, and m_bgData.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::LogoutPlayer().

◆ IsInvitedForBattlegroundInstance() [2/2]

bool Player::IsInvitedForBattlegroundInstance ( uint32  instanceId) const
12237{
12238 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12239 if (_BgBattlegroundQueueID[i].invitedToInstance == instanceId)
12240 return true;
12241
12242 return false;
12243}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

◆ IsInvitedForBattlegroundQueueType()

bool Player::IsInvitedForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12179{
12180 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12181 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12182 return _BgBattlegroundQueueID[i].invitedToInstance != 0;
12183
12184 return false;
12185}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattleFieldPortOpcode().

◆ IsInWater()

bool Player::IsInWater ( ) const
inlineoverridevirtual

Reimplemented from Unit.

1137{ return m_isInWater; }

References m_isInWater.

Referenced by WorldSession::HandleMovementOpcodes().

◆ IsInWhisperWhiteList()

bool Player::IsInWhisperWhiteList ( ObjectGuid  guid)
15832{
15833 for (auto const& itr : WhisperList)
15834 {
15835 if (itr == guid)
15836 {
15837 return true;
15838 }
15839 }
15840
15841 return false;
15842}

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ IsMaxLevel()

bool Player::IsMaxLevel ( ) const

◆ IsMirrorTimerActive()

bool Player::IsMirrorTimerActive ( MirrorTimerType  type)
inline
2070{ return m_MirrorTimer[type] == getMaxTimer(type); }

References getMaxTimer(), and m_MirrorTimer.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsNeedCastPassiveSpellAtLearn()

bool Player::IsNeedCastPassiveSpellAtLearn ( SpellInfo const *  spellInfo) const
3283{
3284 // note: form passives activated with shapeshift spells be implemented by HandleShapeshiftBoosts instead of spell_learn_spell
3285 // talent dependent passives activated at form apply have proper stance data
3287 return (!spellInfo->Stances || (form && (spellInfo->Stances & (1 << (form - 1)))) ||
3288 (!form && spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)));
3289}
@ SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED
Definition: SharedDefines.h:475

References Unit::GetShapeshiftForm(), SpellInfo::HasAttribute(), SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, and SpellInfo::Stances.

Referenced by _addSpell(), and _addTalentAurasAndSpells().

◆ IsNeverVisible()

bool Player::IsNeverVisible ( ) const
overridevirtual

Reimplemented from WorldObject.

11390{
11392 return true;
11393
11394 if (GetSession()->PlayerLogout() || GetSession()->PlayerLoading())
11395 return true;
11396
11397 return false;
11398}
virtual bool IsNeverVisible() const
Definition: Object.h:667

References GetSession(), and WorldObject::IsNeverVisible().

◆ IsOutdoorPvPActive()

bool Player::IsOutdoorPvPActive ( )

◆ IsPetNeedBeTemporaryUnsummoned()

bool Player::IsPetNeedBeTemporaryUnsummoned ( ) const
inline

◆ IsPvP()

bool Player::IsPvP ( )
16171{
16172 bool result = Unit::IsPvP();
16173
16174 sScriptMgr->OnPlayerIsPvP(this, result);
16175
16176 return result;
16177}
bool IsPvP() const
Definition: Unit.h:981

References Unit::IsPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), DuelComplete(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleRequestPartyMemberStatsOpcode(), IsOutdoorPvPActive(), UpdatePvPFlag(), and UpdatePvPState().

◆ IsQuestRewarded()

bool Player::IsQuestRewarded ( uint32  quest_id) const
inline

◆ isResurrectRequested()

bool Player::isResurrectRequested ( ) const
inline

◆ isResurrectRequestedBy()

bool Player::isResurrectRequestedBy ( ObjectGuid  guid) const
inline
1835{ return m_resurrectGUID && m_resurrectGUID == guid; }

References m_resurrectGUID.

◆ IsSpectator()

◆ IsSpellFitByClassAndRace()

bool Player::IsSpellFitByClassAndRace ( uint32  spell_id) const
12306{
12307 uint32 racemask = getRaceMask();
12308 uint32 classmask = getClassMask();
12309
12310 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
12311 if (bounds.first == bounds.second)
12312 return true;
12313
12314 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
12315 {
12316 // skip wrong race skills
12317 if (_spell_idx->second->RaceMask && (_spell_idx->second->RaceMask & racemask) == 0)
12318 continue;
12319
12320 // skip wrong class skills
12321 if (_spell_idx->second->ClassMask && (_spell_idx->second->ClassMask & classmask) == 0)
12322 continue;
12323
12324 return true;
12325 }
12326
12327 return false;
12328}

References Unit::getClassMask(), Unit::getRaceMask(), and sSpellMgr.

Referenced by GetTrainerSpellState(), learn_commandscript::HandleLearnAllMySpellsCommand(), and WorldSession::SendTrainerList().

◆ IsSummonAsSpectator()

bool Player::IsSummonAsSpectator ( ) const

◆ isTaxiCheater()

bool Player::isTaxiCheater ( ) const
inline

◆ isTotalImmune()

bool Player::isTotalImmune ( ) const
13257{
13259
13260 uint32 immuneMask = 0;
13261 for (AuraEffectList::const_iterator itr = immune.begin(); itr != immune.end(); ++itr)
13262 {
13263 immuneMask |= (*itr)->GetMiscValue();
13264 if (immuneMask & SPELL_SCHOOL_MASK_ALL) // total immunity
13265 return true;
13266 }
13267 return false;
13268}
@ SPELL_AURA_SCHOOL_IMMUNITY
Definition: SpellAuraDefines.h:102
@ SPELL_SCHOOL_MASK_ALL
Definition: SharedDefines.h:315

References Unit::GetAuraEffectsByType(), SPELL_AURA_SCHOOL_IMMUNITY, and SPELL_SCHOOL_MASK_ALL.

Referenced by CanUseBattlegroundObject(), and IsImmuneToEnvironmentalDamage().

◆ IsTotemCategoryCompatiableWith()

bool Player::IsTotemCategoryCompatiableWith ( ItemTemplate const *  pProto,
uint32  requiredTotemCategoryId 
) const
882{
883 if (requiredTotemCategoryId == 0)
884 return true;
885 if (pProto->TotemCategory == 0)
886 return false;
887
888 TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(pProto->TotemCategory);
889 if (!itemEntry)
890 return false;
891 TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId);
892 if (!reqEntry)
893 return false;
894
895 if (itemEntry->categoryType != reqEntry->categoryType)
896 return false;
897
898 if ((itemEntry->categoryMask & reqEntry->categoryMask) != reqEntry->categoryMask)
899 return false;
900
901 // xinef: check skill requirements, needed for enchants!
902 if (pProto->RequiredSkill)
903 if (this->GetSkillValue(pProto->RequiredSkill) < pProto->RequiredSkillRank)
904 return false;
905
906 return true;
907}
DBCStorage< TotemCategoryEntry > sTotemCategoryStore(TotemCategoryEntryfmt)
Definition: DBCStructure.h:1995
uint32 categoryType
Definition: DBCStructure.h:1999
uint32 categoryMask
Definition: DBCStructure.h:2000

References TotemCategoryEntry::categoryMask, TotemCategoryEntry::categoryType, GetSkillValue(), ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, sTotemCategoryStore, and ItemTemplate::TotemCategory.

Referenced by HasItemTotemCategory().

◆ IsTwoHandUsed()

◆ IsUsingLfg()

bool Player::IsUsingLfg ( )

◆ IsValidGender()

static bool Player::IsValidGender ( uint8  Gender)
inlinestatic
1582{ return Gender <= GENDER_FEMALE; }
Gender
Definition: SharedDefines.h:60

References GENDER_FEMALE.

Referenced by BuildEnumData(), Create(), ConditionMgr::isConditionTypeValid(), and LoadFromDB().

◆ IsValidPos() [1/2]

bool Player::IsValidPos ( uint16  pos,
bool  explicit_pos 
)
inline
1281{ return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
bool IsValidPos(uint16 pos, bool explicit_pos)
Definition: Player.h:1281

References IsValidPos().

Referenced by WorldSession::HandleAutoStoreBagItemOpcode(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), and IsValidPos().

◆ IsValidPos() [2/2]

bool Player::IsValidPos ( uint8  bag,
uint8  slot,
bool  explicit_pos 
)
602{
603 // post selected
604 if (bag == NULL_BAG && !explicit_pos)
605 return true;
606
607 if (bag == INVENTORY_SLOT_BAG_0)
608 {
609 // any post selected
610 if (slot == NULL_SLOT && !explicit_pos)
611 return true;
612
613 // equipment
614 if (slot < EQUIPMENT_SLOT_END)
615 return true;
616
617 // bag equip slots
619 return true;
620
621 // backpack slots
623 return true;
624
625 // keyring slots
626 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END)
627 return true;
628
629 // bank main slots
630 if (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END)
631 return true;
632
633 // bank bag slots
634 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
635 return true;
636
637 return false;
638 }
639
640 // bag content slots
641 // bank bag content slots
642 if (Bag* pBag = GetBagByPos(bag))
643 {
644 // any post selected
645 if (slot == NULL_SLOT && !explicit_pos)
646 return true;
647
648 return slot < pBag->GetBagSize();
649 }
650
651 // where this?
652 return false;
653}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, EQUIPMENT_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_END, KEYRING_SLOT_START, NULL_BAG, and NULL_SLOT.

◆ IsVisibleGloballyFor()

bool Player::IsVisibleGloballyFor ( Player const *  player) const
11435{
11436 if (!u)
11437 return false;
11438
11439 // Always can see self
11440 if (u == this)
11441 return true;
11442
11443 // Visible units, always are visible for all players
11444 if (IsVisible())
11445 return true;
11446
11447 // GMs are visible for higher gms (or players are visible for gms)
11448 if (!AccountMgr::IsPlayerAccount(u->GetSession()->GetSecurity()))
11449 return GetSession()->GetSecurity() <= u->GetSession()->GetSecurity();
11450
11451 if (!sScriptMgr->OnPlayerNotVisibleGloballyFor(const_cast<Player*>(this), u))
11452 return true;
11453
11454 // non faction visibility non-breakable for non-GMs
11455 return false;
11456}
bool IsVisible() const
Definition: Unit.h:1916
AccountTypes GetSecurity() const
Definition: WorldSession.h:373

References WorldSession::GetSecurity(), GetSession(), AccountMgr::IsPlayerAccount(), Unit::IsVisible(), and sScriptMgr.

Referenced by SocialMgr::BroadcastToFriendListers(), SocialMgr::GetFriendInfo(), WorldSession::HandleAddFriendOpcode(), and ChatHandler::needReportToTarget().

◆ ItemAddedQuestCheck()

void Player::ItemAddedQuestCheck ( uint32  entry,
uint32  count 
)
1836{
1837 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1838 {
1839 uint32 questid = GetQuestSlotQuestId(i);
1840 if (questid == 0)
1841 continue;
1842
1843 QuestStatusData& q_status = m_QuestStatus[questid];
1844
1845 if (q_status.Status != QUEST_STATUS_INCOMPLETE)
1846 continue;
1847
1848 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1849 if (!qInfo || !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1850 continue;
1851
1852 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1853 {
1854 uint32 reqitem = qInfo->RequiredItemId[j];
1855 if (reqitem == entry)
1856 {
1857 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1858 uint16 curitemcount = q_status.ItemCount[j];
1859 if (curitemcount < reqitemcount)
1860 {
1861 q_status.ItemCount[j] = std::min<uint16>(q_status.ItemCount[j] + count, reqitemcount);
1862 m_QuestStatusSave[questid] = true;
1863 }
1864 if (CanCompleteQuest(questid))
1865 CompleteQuest(questid);
1866 else
1868 }
1869 }
1870 }
1872}

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, QuestStatusData::Status, and UpdateForQuestWorldObjects().

Referenced by Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), MoveItemToInventory(), StoreNewItem(), and SwapItem().

◆ ItemRemovedQuestCheck()

void Player::ItemRemovedQuestCheck ( uint32  entry,
uint32  count 
)
1875{
1876 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1877 {
1878 uint32 questid = GetQuestSlotQuestId(i);
1879 if (!questid)
1880 continue;
1881
1882 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1883 if (!qInfo)
1884 continue;
1885
1887 continue;
1888
1889 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1890 {
1891 uint32 reqitem = qInfo->RequiredItemId[j];
1892 if (reqitem == entry)
1893 {
1894 QuestStatusData& q_status = m_QuestStatus[questid];
1895 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1896 uint16 curitemcount = q_status.ItemCount[j];
1897
1898 if (q_status.ItemCount[j] >= reqitemcount) // we may have more than what the status shows
1899 curitemcount = GetItemCount(entry, false);
1900
1901 uint16 newItemCount = (count > curitemcount) ? 0 : curitemcount - count;
1902 newItemCount = std::min<uint16>(newItemCount, reqitemcount);
1903 if (newItemCount != q_status.ItemCount[j])
1904 {
1905 q_status.ItemCount[j] = newItemCount;
1906 m_QuestStatusSave[questid] = true;
1907 IncompleteQuest(questid);
1908 }
1909 }
1910 }
1911 }
1913}
void IncompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:642

References GetItemCount(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), IncompleteQuest(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and UpdateForQuestWorldObjects().

Referenced by DestroyItem(), DestroyItemCount(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ JoinedChannel()

void Player::JoinedChannel ( Channel c)
5001{
5002 m_channels.push_back(c);
5003}

References m_channels.

Referenced by Channel::JoinChannel().

◆ KillCreditGO()

void Player::KillCreditGO ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
2057{
2058 uint16 addCastCount = 1;
2059 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2060 {
2061 uint32 questid = GetQuestSlotQuestId(i);
2062 if (!questid)
2063 continue;
2064
2065 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2066 if (!qInfo)
2067 continue;
2068
2069 QuestStatusData& q_status = m_QuestStatus[questid];
2070
2071 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2072 {
2073 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)*/)
2074 {
2075 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2076 {
2077 uint32 reqTarget = 0;
2078
2079 // GO activate objective
2080 if (qInfo->RequiredNpcOrGo[j] < 0)
2081 // checked at quest_template loading
2082 reqTarget = - qInfo->RequiredNpcOrGo[j];
2083
2084 // other not this creature/GO related objectives
2085 if (reqTarget != entry)
2086 continue;
2087
2088 uint32 reqCastCount = qInfo->RequiredNpcOrGoCount[j];
2089 uint16 curCastCount = q_status.CreatureOrGOCount[j];
2090 if (curCastCount < reqCastCount)
2091 {
2092 q_status.CreatureOrGOCount[j] = curCastCount + addCastCount;
2093
2094 m_QuestStatusSave[questid] = true;
2095
2096 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curCastCount, addCastCount);
2097 }
2098
2099 if (CanCompleteQuest(questid))
2100 CompleteQuest(questid);
2101 else
2103
2104 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2105 break;
2106 }
2107 }
2108 }
2109 }
2110}
void SendQuestUpdateAddCreatureOrGo(Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
Definition: PlayerQuest.cpp:2456

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::Use().

◆ KilledMonster()

void Player::KilledMonster ( CreatureTemplate const *  cInfo,
ObjectGuid  guid 
)
1916{
1917 ASSERT(cInfo);
1918
1919 if (cInfo->Entry)
1920 KilledMonsterCredit(cInfo->Entry, guid);
1921
1922 for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
1923 if (cInfo->KillCredit[i])
1924 KilledMonsterCredit(cInfo->KillCredit[i]);
1925}
#define MAX_KILL_CREDIT
Definition: CreatureData.h:30
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: PlayerQuest.cpp:1927

References ASSERT, CreatureTemplate::Entry, CreatureTemplate::KillCredit, KilledMonsterCredit(), and MAX_KILL_CREDIT.

Referenced by KillRewarder::_RewardKillCredit(), and npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit().

◆ KilledMonsterCredit()

void Player::KilledMonsterCredit ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
1928{
1929 uint16 addkillcount = 1;
1930 uint32 real_entry = entry;
1931 if (guid)
1932 {
1933 Creature* killed = GetMap()->GetCreature(guid);
1934 if (killed && killed->GetEntry())
1935 real_entry = killed->GetEntry();
1936 }
1937
1938 StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST
1939 UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addkillcount, guid ? GetMap()->GetCreature(guid) : nullptr);
1940
1941 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1942 {
1943 uint32 questid = GetQuestSlotQuestId(i);
1944 if (!questid)
1945 continue;
1946
1947 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1948 if (!qInfo)
1949 continue;
1950 // just if !ingroup || !noraidgroup || raidgroup
1951 // xinef: or is pvp quest, and player in BG/BF group
1952 QuestStatusData& q_status = m_QuestStatus[questid];
1953 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty()) ||
1954 (qInfo->IsPVPQuest() && (GetGroup()->isBFGroup() || GetGroup()->isBGGroup()))))
1955 {
1956 if (!sScriptMgr->OnPlayerPassedQuestKilledMonsterCredit(this, qInfo, entry, real_entry, guid))
1957 continue;
1958
1959 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST)*/)
1960 {
1961 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1962 {
1963 // skip GO activate objective or none
1964 if (qInfo->RequiredNpcOrGo[j] <= 0)
1965 continue;
1966
1967 uint32 reqkill = qInfo->RequiredNpcOrGo[j];
1968
1969 if (reqkill == real_entry)
1970 {
1971 uint32 reqkillcount = qInfo->RequiredNpcOrGoCount[j];
1972 uint16 curkillcount = q_status.CreatureOrGOCount[j];
1973 if (curkillcount < reqkillcount)
1974 {
1975 q_status.CreatureOrGOCount[j] = curkillcount + addkillcount;
1976
1977 m_QuestStatusSave[questid] = true;
1978
1979 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curkillcount, addkillcount);
1980 }
1981 if (CanCompleteQuest(questid))
1982 CompleteQuest(questid);
1983 else
1985
1986 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
1987 break;
1988 }
1989 }
1990 }
1991 }
1992 }
1993}
@ ACHIEVEMENT_TIMED_TYPE_CREATURE
Definition: DBCEnums.h:114
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE
Definition: DBCEnums.h:122
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:210
Creature * GetCreature(ObjectGuid const guid)
Definition: Map.cpp:2498
bool IsPVPQuest() const
Definition: QuestDef.h:295

References ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_TIMED_TYPE_CREATURE, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, Map::GetCreature(), GetDifficulty(), Object::GetEntry(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), Quest::IsPVPQuest(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_KILL, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, sScriptMgr, StartTimedAchievement(), QuestStatusData::Status, and UpdateAchievementCriteria().

Referenced by npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundAB::EventPlayerClickedOnFlag(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), spell_q10714_on_spirits_wings::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q12659_ahunaes_knife::HandleDummy(), spell_q9874_liquid_fire::HandleDummy(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), OutdoorPvPNA::HandleKillImpl(), BattlegroundAV::HandleKillUnit(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q11065_wrangle_some_aether_rays_aura::if(), spell_gen_have_item_auras::if(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), KilledMonster(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_scourge_cage::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_captain_saeed::OnGossipSelect(), RewardPlayerAndGroupAtEvent(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), npc_hallows_end_train_fire::SpellHit(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ KilledPlayerCredit()

void Player::KilledPlayerCredit ( uint16  count = 1)
1996{
1997 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1998 {
1999 uint32 questid = GetQuestSlotQuestId(i);
2000 if (!questid)
2001 {
2002 continue;
2003 }
2004
2005 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2006 if (!qInfo)
2007 {
2008 continue;
2009 }
2010
2011 // just if !ingroup || !noraidgroup || raidgroup
2012 QuestStatusData& q_status = m_QuestStatus[questid];
2013 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty())))
2014 {
2015 // Xinef: PvP Killing quest require player to be in same zone as quest zone (only 2 quests so no doubt, can be extended to conditions in cata ;s)
2016 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL) && (qInfo->GetZoneOrSort() >= 0 && GetZoneId() == uint32(qInfo->GetZoneOrSort())))
2017 {
2018 KilledPlayerCreditForQuest(count, qInfo);
2019 break; // there is only one quest per zone
2020 }
2021 }
2022 }
2023}
void KilledPlayerCreditForQuest(uint16 count, Quest const *quest)
Definition: PlayerQuest.cpp:2025
int32 GetZoneOrSort() const
Definition: QuestDef.h:230

References GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), KilledPlayerCreditForQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by KillRewarder::_RewardPlayer().

◆ KilledPlayerCreditForQuest()

void Player::KilledPlayerCreditForQuest ( uint16  count,
Quest const *  quest 
)
2026{
2027 uint32 const questId = quest->GetQuestId();
2028
2029 auto it = m_QuestStatus.find(questId);
2030 if (it == m_QuestStatus.end())
2031 {
2032 return;
2033 }
2034
2035 QuestStatusData& questStatus = it->second;
2036
2037 uint16 curKill = questStatus.PlayerCount;
2038 uint32 reqKill = quest->GetPlayersSlain();
2039
2040 if (curKill < reqKill)
2041 {
2042 count = std::min<uint16>(reqKill - curKill, count);
2043 questStatus.PlayerCount = curKill + count;
2044
2045 m_QuestStatusSave[quest->GetQuestId()] = true;
2046
2047 SendQuestUpdateAddPlayer(quest, curKill, count);
2048 }
2049
2050 if (CanCompleteQuest(questId))
2051 {
2052 CompleteQuest(questId);
2053 }
2054}
void SendQuestUpdateAddPlayer(Quest const *quest, uint16 old_count, uint16 add_count)
Definition: PlayerQuest.cpp:2479

References CanCompleteQuest(), CompleteQuest(), Quest::GetPlayersSlain(), Quest::GetQuestId(), m_QuestStatus, m_QuestStatusSave, QuestStatusData::PlayerCount, and SendQuestUpdateAddPlayer().

Referenced by KilledPlayerCredit().

◆ KillPlayer()

void Player::KillPlayer ( )
4560{
4561 if (IsFlying() && !GetTransport())
4563
4565
4566 StopMirrorTimers(); //disable timers(bars)
4567
4568 setDeathState(DeathState::Corpse);
4569 //SetUnitFlag(UNIT_FLAG_NOT_IN_PVP);
4570
4573
4574 // 6 minutes until repop at graveyard
4576
4577 UpdateCorpseReclaimDelay(); // dependent at use SetDeathPvP() call before kill
4578
4579 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4580
4581 if (corpseReclaimDelay >= 0)
4582 SendCorpseReclaimDelay(corpseReclaimDelay);
4583
4584 sScriptMgr->OnPlayerJustDied(this);
4585 // don't create corpse at this moment, player might be falling
4586
4587 // update visibility
4588 //UpdateObjectVisibility(); // pussywizard: not needed
4589}
@ PLAYER_FIELD_BYTE_RELEASE_TIMER
Definition: Player.h:566
@ MOVE_ROOT
Definition: Player.h:462
@ UNIT_DYNFLAG_NONE
Definition: SharedDefines.h:3120
void ApplyModFlag(uint16 index, uint32 flag, bool apply)
Definition: Object.cpp:899
void UpdateCorpseReclaimDelay()
Definition: PlayerUpdates.cpp:1929
void setDeathState(DeathState s, bool despawn=false) override
Definition: Player.cpp:1020
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:724
MotionMaster * GetMotionMaster()
Definition: Unit.h:1664
bool HasPreventResurectionAura() const
Definition: Unit.h:1712
bool IsFlying() const
Definition: Unit.h:1624
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:627

References Object::ApplyModFlag(), CalculateCorpseReclaimDelay(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetTransport(), Unit::HasPreventResurectionAura(), IN_MILLISECONDS, Unit::IsFlying(), m_deathTimer, MINUTE, MOVE_ROOT, MotionMaster::MoveFall(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, Unit::ReplaceAllDynamicFlags(), SendCorpseReclaimDelay(), setDeathState(), SetMovement(), sMapStore, sScriptMgr, StopMirrorTimers(), UNIT_DYNFLAG_NONE, and UpdateCorpseReclaimDelay().

Referenced by WorldSession::HandleMovementOpcodes(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), and Update().

◆ LearnCustomSpells()

void Player::LearnCustomSpells ( )
11786{
11787 if (!sWorld->getBoolConfig(CONFIG_START_CUSTOM_SPELLS))
11788 {
11789 return;
11790 }
11791
11792 // learn default race/class spells
11793 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11794 ASSERT(info);
11795 for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr)
11796 {
11797 uint32 tspell = *itr;
11798 LOG_DEBUG("entities.player.loading", "Player::LearnCustomSpells: Player '{}' ({}, Class: {} Race: {}): Adding initial spell (SpellID: {})",
11799 GetName(), GetGUID().ToString(), uint32(getClass()), uint32(getRace()), tspell);
11800 if (!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add
11801 {
11802 addSpell(tspell, SPEC_MASK_ALL, true);
11803 }
11804 else // but send in normal spell in game learn case
11805 {
11806 learnSpell(tspell);
11807 }
11808 }
11809}
@ CONFIG_START_CUSTOM_SPELLS
Definition: IWorld.h:122
PlayerCreateInfoSpells customSpells
Definition: Player.h:354

References addSpell(), ASSERT, CONFIG_START_CUSTOM_SPELLS, PlayerInfo::customSpells, Unit::getClass(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, sObjectMgr, SPEC_MASK_ALL, sWorld, and Position::ToString().

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnDefaultSkill()

void Player::LearnDefaultSkill ( uint32  skillId,
uint16  rank 
)
11826{
11827 SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(skillId, getRace(), getClass());
11828 if (!rcInfo)
11829 return;
11830
11831 LOG_DEBUG("entities.player.loading", "PLAYER (Class: {} Race: {}): Adding initial skill, id = {}", uint32(getClass()), uint32(getRace()), skillId);
11832 switch (GetSkillRangeType(rcInfo))
11833 {
11835 SetSkill(skillId, 0, 300, 300);
11836 break;
11837 case SKILL_RANGE_LEVEL:
11838 {
11839 uint16 skillValue = 1;
11840 uint16 maxValue = GetMaxSkillValueForLevel();
11841 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL) && !IsProfessionOrRidingSkill(skillId))
11842 {
11843 skillValue = maxValue;
11844 }
11845 else if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11846 {
11847 skillValue = maxValue;
11848 }
11850 {
11851 skillValue = std::min(std::max<uint16>({ 1, uint16((GetLevel() - 1) * 5) }), maxValue);
11852 }
11853 else if (skillId == SKILL_FIST_WEAPONS)
11854 {
11855 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED));
11856 }
11857 else if (skillId == SKILL_LOCKPICKING)
11858 {
11859 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING));
11860 }
11861
11862 SetSkill(skillId, 0, skillValue, maxValue);
11863 break;
11864 }
11865 case SKILL_RANGE_MONO:
11866 SetSkill(skillId, 0, 1, 1);
11867 break;
11868 case SKILL_RANGE_RANK:
11869 {
11870 if (!rank)
11871 {
11872 break;
11873 }
11874
11875 SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTierID);
11876 uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)];
11877 uint16 skillValue = 1;
11878 if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11879 {
11880 skillValue = maxValue;
11881 }
11883 {
11884 skillValue = std::min(std::max<uint16>({ uint16(1), uint16((GetLevel() - 1) * 5) }), maxValue);
11885 }
11886
11887 SetSkill(skillId, rank, skillValue, maxValue);
11888 break;
11889 }
11890 default:
11891 break;
11892 }
11893}
@ CLASS_CONTEXT_SKILL
Definition: UnitDefines.h:232
bool IsProfessionOrRidingSkill(uint32 skill)
Definition: SpellMgr.h:623
@ SKILL_RANGE_RANK
Definition: ObjectMgr.h:676
@ SKILL_FLAG_ALWAYS_MAX_VALUE
Definition: DBCEnums.h:386
uint32 SkillTierID
Definition: DBCStructure.h:1577
uint32 Flags
Definition: DBCStructure.h:1575
uint32 Value[MAX_SKILL_STEP]
Definition: DBCStructure.h:1619

References CLASS_CONTEXT_SKILL, CLASS_DEATH_KNIGHT, CONFIG_ALWAYS_MAXSKILL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), Unit::GetLevel(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), GetSkillValue(), IsClass(), IsProfessionOrRidingSkill(), LOG_DEBUG, SetSkill(), SKILL_FIST_WEAPONS, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_LOCKPICKING, SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_RANGE_RANK, SKILL_UNARMED, SkillRaceClassInfoEntry::SkillTierID, sSkillTiersStore, sWorld, and SkillTiersEntry::Value.

Referenced by _addSpell(), and LearnDefaultSkills().

◆ LearnDefaultSkills()

void Player::LearnDefaultSkills ( )
11812{
11813 // learn default race/class skills
11814 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11815 for (PlayerCreateInfoSkills::const_iterator itr = info->skills.begin(); itr != info->skills.end(); ++itr)
11816 {
11817 uint32 skillId = itr->SkillId;
11818 if (HasSkill(skillId))
11819 continue;
11820
11821 LearnDefaultSkill(skillId, itr->Rank);
11822 }
11823}
PlayerCreateInfoSkills skills
Definition: Player.h:357

References Unit::getClass(), Unit::getRace(), HasSkill(), LearnDefaultSkill(), PlayerInfo::skills, and sObjectMgr.

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnPetTalent()

void Player::LearnPetTalent ( ObjectGuid  petGuid,
uint32  talentId,
uint32  talentRank 
)
14020{
14021 Pet* pet = GetPet();
14022
14023 if (!pet)
14024 return;
14025
14026 if (petGuid != pet->GetGUID())
14027 return;
14028
14029 uint32 CurTalentPoints = pet->GetFreeTalentPoints();
14030
14031 if (CurTalentPoints == 0)
14032 return;
14033
14034 if (talentRank >= MAX_PET_TALENT_RANK)
14035 return;
14036
14037 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14038
14039 if (!talentInfo)
14040 return;
14041
14042 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
14043
14044 if (!talentTabInfo)
14045 return;
14046
14047 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14048
14049 if (!ci)
14050 return;
14051
14052 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14053
14054 if (!pet_family)
14055 return;
14056
14057 if (pet_family->petTalentType < 0) // not hunter pet
14058 return;
14059
14060 // prevent learn talent for different family (cheating)
14061 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14062 return;
14063
14064 // find current max talent rank (0~5)
14065 uint8 curtalent_maxrank = 0; // 0 = not learned any rank
14066 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14067 {
14068 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14069 {
14070 curtalent_maxrank = (rank + 1);
14071 break;
14072 }
14073 }
14074
14075 // we already have same or higher talent rank learned
14076 if (curtalent_maxrank >= (talentRank + 1))
14077 return;
14078
14079 // check if we have enough talent points
14080 if (CurTalentPoints < (talentRank - curtalent_maxrank + 1))
14081 return;
14082
14083 // Check if it requires another talent
14084 if (talentInfo->DependsOn > 0)
14085 {
14086 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
14087 {
14088 bool hasEnoughRank = false;
14089 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
14090 {
14091 if (depTalentInfo->RankID[rank] != 0)
14092 if (pet->HasSpell(depTalentInfo->RankID[rank]))
14093 hasEnoughRank = true;
14094 }
14095 if (!hasEnoughRank)
14096 return;
14097 }
14098 }
14099
14100 // Find out how many points we have in this field
14101 uint32 spentPoints = 0;
14102
14103 uint32 tTab = talentInfo->TalentTab;
14104 if (talentInfo->Row > 0)
14105 {
14106 uint32 numRows = sTalentStore.GetNumRows();
14107 for (uint32 i = 0; i < numRows; ++i) // Loop through all talents.
14108 {
14109 // Someday, someone needs to revamp
14110 const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i);
14111 if (tmpTalent) // the way talents are tracked
14112 {
14113 if (tmpTalent->TalentTab == tTab)
14114 {
14115 for (uint8 rank = 0; rank < MAX_TALENT_RANK; rank++)
14116 {
14117 if (tmpTalent->RankID[rank] != 0)
14118 {
14119 if (pet->HasSpell(tmpTalent->RankID[rank]))
14120 {
14121 spentPoints += (rank + 1);
14122 }
14123 }
14124 }
14125 }
14126 }
14127 }
14128 }
14129
14130 // not have required min points spent in talent tree
14131 if (spentPoints < (talentInfo->Row * MAX_PET_TALENT_RANK))
14132 return;
14133
14134 // spell not set in talent.dbc
14135 uint32 spellid = talentInfo->RankID[talentRank];
14136 if (spellid == 0)
14137 {
14138 LOG_ERROR("entities.player", "Talent.dbc have for talent: {} Rank: {} spell id = 0", talentId, talentRank);
14139 return;
14140 }
14141
14142 // already known
14143 if (pet->HasSpell(spellid))
14144 return;
14145
14146 // learn! (other talent ranks will unlearned at learning)
14147 pet->learnSpell(spellid);
14148 LOG_DEBUG("entities.player", "PetTalentID: {} Rank: {} Spell: {}\n", talentId, talentRank, spellid);
14149
14150 // update free talent points
14151 pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
14152}
#define MAX_PET_TALENT_RANK
Definition: DBCStructure.h:1920
void SetFreeTalentPoints(uint8 points)
Definition: Pet.h:132
bool learnSpell(uint32 spell_id)
Definition: Pet.cpp:1909
uint32 Row
Definition: DBCStructure.h:1927
uint32 DependsOnRank
Definition: DBCStructure.h:1933
uint32 DependsOn
Definition: DBCStructure.h:1931

References TalentEntry::DependsOn, TalentEntry::DependsOnRank, CreatureTemplate::family, Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), Object::GetGUID(), GetPet(), Pet::HasSpell(), Pet::learnSpell(), LOG_DEBUG, LOG_ERROR, MAX_PET_TALENT_RANK, MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, TalentEntry::RankID, TalentEntry::Row, sCreatureFamilyStore, Pet::SetFreeTalentPoints(), sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by WorldSession::HandleLearnPreviewTalentsPet(), and WorldSession::HandlePetLearnTalent().

◆ learnQuestRewardedSpells() [1/2]

void Player::learnQuestRewardedSpells ( )
11928{
11929 // learn spells received from quest completing
11930 for (RewardedQuestSet::const_iterator itr = m_RewardedQuests.begin(); itr != m_RewardedQuests.end(); ++itr)
11931 {
11932 Quest const* quest = sObjectMgr->GetQuestTemplate(*itr);
11933 if (!quest)
11934 continue;
11935
11937 }
11938}

References learnQuestRewardedSpells(), m_RewardedQuests, and sObjectMgr.

Referenced by _LoadQuestStatusRewarded(), learn_commandscript::HandleLearnAllDefaultCommand(), learnQuestRewardedSpells(), and resetSpells().

◆ learnQuestRewardedSpells() [2/2]

void Player::learnQuestRewardedSpells ( Quest const *  quest)
11896{
11897 // xinef: quest does not learn anything
11898 int32 spellId = quest->GetRewSpellCast();
11899 if (!spellId)
11900 return;
11901
11902 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
11903 if (!spellInfo)
11904 return;
11905
11906 // xinef: find effect with learn spell and check if we have this spell
11907 bool found = false;
11908 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
11909 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && spellInfo->Effects[i].TriggerSpell && !HasSpell(spellInfo->Effects[i].TriggerSpell))
11910 {
11911 // pusywizard: don't re-add profession specialties!
11912 if (SpellInfo const* triggeredInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
11913 if (triggeredInfo->Effects[0].Effect == SPELL_EFFECT_TRADE_SKILL)
11914 break; // pussywizard: break and not cast the spell (found is false)
11915
11916 found = true;
11917 break;
11918 }
11919
11920 // xinef: we know the spell, return
11921 if (!found)
11922 return;
11923
11924 CastSpell(this, spellId, true);
11925}
@ SPELL_EFFECT_TRADE_SKILL
Definition: SharedDefines.h:825

References Unit::CastSpell(), SpellInfo::Effects, Quest::GetRewSpellCast(), HasSpell(), MAX_SPELL_EFFECTS, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_TRADE_SKILL, and sSpellMgr.

◆ learnSkillRewardedSpells()

void Player::learnSkillRewardedSpells ( uint32  id,
uint32  value 
)
11941{
11942 uint32 raceMask = getRaceMask();
11943 uint32 classMask = getClassMask();
11944 for (SkillLineAbilityEntry const* pAbility : GetSkillLineAbilitiesBySkillLine(skill_id))
11945 {
11946 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pAbility->Spell);
11947 if (!spellInfo)
11948 {
11949 continue;
11950 }
11951
11952 if (pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
11953 {
11954 continue;
11955 }
11956
11957 // Check race if set
11958 if (pAbility->RaceMask && !(pAbility->RaceMask & raceMask))
11959 {
11960 continue;
11961 }
11962
11963 // Check class if set
11964 if (pAbility->ClassMask && !(pAbility->ClassMask & classMask))
11965 {
11966 continue;
11967 }
11968
11969 // need unlearn spell
11970 if (skill_value < pAbility->MinSkillLineRank && pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
11971 {
11972 removeSpell(pAbility->Spell, GetActiveSpec(), true);
11973 }
11974 // need learn
11975 else
11976 {
11977 //used to avoid double Seal of Righteousness on paladins, it's the only player spell which has both spell and forward spell in auto learn
11978 if (pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && pAbility->SupercededBySpell)
11979 {
11980 bool skipCurrent = false;
11981 auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(pAbility->SupercededBySpell);
11982 for (auto itr = bounds.first; itr != bounds.second; ++itr)
11983 {
11984 if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skill_value >= itr->second->MinSkillLineRank)
11985 {
11986 skipCurrent = true;
11987 break;
11988 }
11989 }
11990 if (skipCurrent)
11991 {
11992 continue;
11993 }
11994 }
11995
11996 if (!IsInWorld())
11997 {
11998 addSpell(pAbility->Spell, SPEC_MASK_ALL, true, true);
11999 }
12000 else
12001 {
12002 learnSpell(pAbility->Spell, true, true);
12003 }
12004 }
12005 }
12006}
const std::vector< SkillLineAbilityEntry const * > & GetSkillLineAbilitiesBySkillLine(uint32 skillLine)
Definition: DBCStores.cpp:916
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE
Definition: DBCEnums.h:360
Definition: DBCStructure.h:1599

References addSpell(), GetActiveSpec(), Unit::getClassMask(), Unit::getRaceMask(), GetSkillLineAbilitiesBySkillLine(), Object::IsInWorld(), learnSpell(), removeSpell(), SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE, SPEC_MASK_ALL, and sSpellMgr.

Referenced by _LoadSkills(), SetSkill(), and UpdateSkillPro().

◆ learnSpell()

void Player::learnSpell ( uint32  spellId,
bool  temporary = false,
bool  learnFromSkill = false 
)
3292{
3293 // Xinef: don't allow to learn active spell once more
3294 if (HasActiveSpell(spellId))
3295 {
3296 LOG_DEBUG("entities.player", "Player ({}) tries to learn already active spell: {}", GetGUID().ToString(), spellId);
3297 return;
3298 }
3299
3300 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spellId);
3301 bool thisSpec = GetTalentSpellCost(firstRankSpellId) > 0 || sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId);
3302 bool added = addSpell(spellId, thisSpec ? GetActiveSpecMask() : SPEC_MASK_ALL, true, temporary, learnFromSkill);
3303 if (added)
3304 {
3305 sScriptMgr->OnPlayerLearnSpell(this, spellId);
3306
3307 // pussywizard: a system message "you have learnt spell X (rank Y)"
3308 if (IsInWorld())
3309 SendLearnPacket(spellId, true);
3310 }
3311
3312 // pussywizard: rank stuff at the end!
3313 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spellId))
3314 {
3315 // pussywizard: lookup next rank in m_spells (the only talents on m_spella are for example pyroblast, that have all ranks restored upon learning rank 1)
3316 // pussywizard: next ranks must not be in current spec (otherwise no need to learn already learnt)
3317 PlayerSpellMap::iterator itr = m_spells.find(nextSpell);
3318 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && !itr->second->IsInSpec(m_activeSpec))
3319 learnSpell(nextSpell, temporary);
3320 }
3321
3322 // xinef: if we learn new spell, check all spells requiring this spell, if we have such a spell, and it is not in current spec - learn it
3323 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(spellId);
3324 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequiringSpell.first; itr != spellsRequiringSpell.second; ++itr)
3325 {
3326 PlayerSpellMap::iterator itr2 = m_spells.find(itr->second);
3327 if (itr2 != m_spells.end() && itr2->second->State != PLAYERSPELL_REMOVED && !itr2->second->IsInSpec(m_activeSpec))
3328 learnSpell(itr2->first, temporary);
3329 }
3330}
uint32 GetTalentSpellCost(uint32 spellId)
Definition: DBCStores.cpp:686

References addSpell(), GetActiveSpecMask(), Object::GetGUID(), GetTalentSpellCost(), HasActiveSpell(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, m_activeSpec, m_spells, PLAYERSPELL_REMOVED, SendLearnPacket(), SPEC_MASK_ALL, sScriptMgr, sSpellMgr, and Position::ToString().

Referenced by _addSpell(), Spell::EffectLearnSpell(), learn_commandscript::HandleLearnAllGMCommand(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllMySpellsCommand(), learn_commandscript::HandleLearnSkillRecipesHelper(), Acore::PlayerCommand::HandleLearnSpellCommand(), spell_gen_profession_research::HandleScript(), spell_item_book_of_glyph_mastery::HandleScript(), WorldSession::HandleTrainerBuySpellOpcode(), LearnCustomSpells(), learnSkillRewardedSpells(), learnSpell(), learnSpellHighRank(), LearnTalent(), and UpdateCraftSkill().

◆ learnSpellHighRank()

void Player::learnSpellHighRank ( uint32  spellid)
13610{
13611 learnSpell(spellid);
13612
13613 if (uint32 next = sSpellMgr->GetNextSpellInChain(spellid))
13614 learnSpellHighRank(next);
13615}
void learnSpellHighRank(uint32 spellid)
Definition: Player.cpp:13609

References learnSpell(), learnSpellHighRank(), and sSpellMgr.

Referenced by learnSpellHighRank().

◆ LearnTalent()

void Player::LearnTalent ( uint32  talentId,
uint32  talentRank,
bool  command = false 
)
13887{
13888 uint32 CurTalentPoints = GetFreeTalentPoints();
13889
13890 if (!command)
13891 {
13892 // xinef: check basic data
13893 if (!CurTalentPoints)
13894 {
13895 return;
13896 }
13897
13898 if (talentRank >= MAX_TALENT_RANK)
13899 {
13900 return;
13901 }
13902 }
13903
13904 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
13905 if (!talentInfo)
13906 return;
13907
13908 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
13909 if (!talentTabInfo)
13910 return;
13911
13912 // xinef: prevent learn talent for different class (cheating)
13913 if ((getClassMask() & talentTabInfo->ClassMask) == 0)
13914 return;
13915
13916 // xinef: find current talent rank
13917 uint32 currentTalentRank = 0;
13918 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
13919 {
13920 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], GetActiveSpec()))
13921 {
13922 currentTalentRank = rank + 1;
13923 break;
13924 }
13925 }
13926
13927 // xinef: we already have same or higher rank talent learned
13928 if (currentTalentRank >= talentRank + 1)
13929 return;
13930
13931 uint32 talentPointsChange = (talentRank - currentTalentRank + 1);
13932 if (!command)
13933 {
13934 // xinef: check if we have enough free talent points
13935 if (CurTalentPoints < talentPointsChange)
13936 {
13937 return;
13938 }
13939 }
13940
13941 // xinef: check if talent deponds on another talent
13942 if (talentInfo->DependsOn > 0)
13943 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
13944 {
13945 bool hasEnoughRank = false;
13946 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
13947 {
13948 if (depTalentInfo->RankID[rank] != 0)
13949 if (HasTalent(depTalentInfo->RankID[rank], GetActiveSpec()))
13950 {
13951 hasEnoughRank = true;
13952 break;
13953 }
13954 }
13955
13956 // xinef: does not have enough talent points spend in required talent
13957 if (!hasEnoughRank)
13958 return;
13959 }
13960
13961 if (!command)
13962 {
13963 // xinef: check amount of points spent in current talent tree
13964 // xinef: be smart and quick
13965 uint32 spentPoints = 0;
13966 if (talentInfo->Row > 0)
13967 {
13968 const PlayerTalentMap& talentMap = GetTalentMap();
13969 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
13970 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
13971 if (TalentEntry const* itrTalentInfo = sTalentStore.LookupEntry(talentPos->talent_id))
13972 if (itrTalentInfo->TalentTab == talentInfo->TalentTab)
13973 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec())) // pussywizard
13974 spentPoints += talentPos->rank + 1;
13975 }
13976
13977 // xinef: we do not have enough talent points to add talent of this tier
13978 if (spentPoints < (talentInfo->Row * MAX_TALENT_RANK))
13979 return;
13980 }
13981
13982 // xinef: hacking attempt, tries to learn unknown rank
13983 uint32 spellId = talentInfo->RankID[talentRank];
13984 if (spellId == 0)
13985 return;
13986
13987 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
13988 if (!spellInfo)
13989 return;
13990
13991 bool learned = false;
13992
13993 // xinef: if talent info has special marker in dbc - add to spell book
13994 if (talentInfo->addToSpellBook)
13995 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
13996 {
13997 learnSpell(spellId);
13998 learned = true;
13999 }
14000
14001 if (!learned)
14002 SendLearnPacket(spellId, true);
14003
14004 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
14005 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
14006 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
14007 learnSpell(spellInfo->Effects[i].TriggerSpell);
14008
14009 addTalent(spellId, GetActiveSpecMask(), currentTalentRank);
14010
14011 if (!command)
14012 {
14013 SetFreeTalentPoints(CurTalentPoints - talentPointsChange);
14014 }
14015
14016 sScriptMgr->OnPlayerLearnTalents(this, talentId, talentRank, spellId);
14017}
uint32 ClassMask
Definition: DBCStructure.h:1947

References addTalent(), TalentEntry::addToSpellBook, TalentTabEntry::ClassMask, TalentEntry::DependsOn, TalentEntry::DependsOnRank, SpellInfo::Effects, GetActiveSpec(), GetActiveSpecMask(), Unit::getClassMask(), GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasTalent(), learnSpell(), MAX_SPELL_EFFECTS, MAX_TALENT_RANK, PLAYERSPELL_REMOVED, TalentEntry::RankID, TalentEntry::Row, SendLearnPacket(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by learn_commandscript::HandleLearnAllMyTalentsCommand(), WorldSession::HandleLearnPreviewTalents(), and WorldSession::HandleLearnTalentOpcode().

◆ LeaveAllArenaTeams()

void Player::LeaveAllArenaTeams ( ObjectGuid  guid)
static
10125{
10126 // xinef: sync query
10128 stmt->SetData(0, guid.GetCounter());
10129 PreparedQueryResult result = CharacterDatabase.Query(stmt);
10130
10131 if (!result)
10132 return;
10133
10134 do
10135 {
10136 Field* fields = result->Fetch();
10137 uint32 arenaTeamId = fields[0].Get<uint32>();
10138 if (arenaTeamId != 0)
10139 {
10140 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
10141 if (arenaTeam)
10142 arenaTeam->DelMember(guid, true);
10143 }
10144 } while (result->NextRow());
10145}
@ CHAR_SEL_PLAYER_ARENA_TEAMS
Definition: CharacterDatabase.h:233
void DelMember(ObjectGuid guid, bool cleanDb)
Definition: ArenaTeam.cpp:325

References CHAR_SEL_PLAYER_ARENA_TEAMS, CharacterDatabase, ArenaTeam::DelMember(), Field::Get(), ObjectGuid::GetCounter(), sArenaTeamMgr, and PreparedStatementBase::SetData().

Referenced by DeleteFromDB(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ LeaveBattleground()

void Player::LeaveBattleground ( Battleground bg = nullptr)
11270{
11271 if (!bg)
11272 bg = GetBattleground();
11273
11274 if (!bg)
11275 return;
11276
11277 // Deserter tracker - leave BG
11278 if (bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11279 {
11280 if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS))
11281 {
11283 stmt->SetData(0, GetGUID().GetCounter());
11285 CharacterDatabase.Execute(stmt);
11286 }
11287 sScriptMgr->OnPlayerBattlegroundDesertion(this, BG_DESERTION_TYPE_LEAVE_BG);
11288 }
11289
11290 if (bg->isArena() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11291 sScriptMgr->OnPlayerBattlegroundDesertion(this, ARENA_DESERTION_TYPE_LEAVE_BG);
11292
11293 // xinef: reset corpse reclaim time
11295
11296 // Remove all dots
11300
11301 // pussywizard: clear movement, because after porting player will move to arena cords
11303 StopMoving();
11305}
@ SPELL_AURA_PERIODIC_DAMAGE
Definition: SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition: SpellAuraDefines.h:152
@ SPELL_AURA_PERIODIC_LEECH
Definition: SpellAuraDefines.h:116
@ CONFIG_BATTLEGROUND_TRACK_DESERTERS
Definition: IWorld.h:114
@ BG_DESERTION_TYPE_LEAVE_BG
Definition: Battleground.h:52
@ ARENA_DESERTION_TYPE_LEAVE_BG
Definition: Battleground.h:57
@ STATUS_WAIT_JOIN
Definition: Battleground.h:192
@ CHAR_INS_DESERTER_TRACK
Definition: CharacterDatabase.h:501
bool isBattleground() const
Definition: Battleground.h:405
BattlegroundStatus GetStatus() const
Definition: Battleground.h:323
bool TeleportToEntryPoint()
Definition: Player.cpp:1606
void StopMoving()
Definition: Unit.cpp:16683
void MovementExpired(bool reset=true)
Definition: MotionMaster.h:180

References ARENA_DESERTION_TYPE_LEAVE_BG, BG_DESERTION_TYPE_LEAVE_BG, CHAR_INS_DESERTER_TRACK, CharacterDatabase, CONFIG_BATTLEGROUND_TRACK_DESERTERS, GetBattleground(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetMotionMaster(), Battleground::GetStatus(), Battleground::isArena(), Battleground::isBattleground(), m_deathExpireTime, MotionMaster::MovementExpired(), Unit::RemoveAurasByType(), PreparedStatementBase::SetData(), SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_LEECH, sScriptMgr, STATUS_IN_PROGRESS, STATUS_WAIT_JOIN, Unit::StopMoving(), sWorld, and TeleportToEntryPoint().

Referenced by BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::LogoutPlayer(), and ToggleAFK().

◆ LeftChannel()

void Player::LeftChannel ( Channel c)
5006{
5007 m_channels.remove(c);
5008}

References m_channels.

Referenced by Channel::KickOrBan(), Channel::LeaveChannel(), and UpdateLocalChannels().

◆ LoadActions()

void Player::LoadActions ( PreparedQueryResult  result)
15216{
15217 if (result)
15218 _LoadActions(result);
15219
15221}
void _LoadActions(PreparedQueryResult result)
Definition: PlayerStorage.cpp:5673

References _LoadActions(), and SendActionButtons().

◆ LoadCorpse()

void Player::LoadCorpse ( PreparedQueryResult  result)
5816{
5818 SpawnCorpseBones(false);
5819
5820 if (!IsAlive())
5821 {
5822 if (result && !HasAtLoginFlag(AT_LOGIN_RESURRECT))
5823 {
5824 Field* fields = result->Fetch();
5825 _corpseLocation.WorldRelocate(fields[0].Get<uint16>(), fields[1].Get<float>(), fields[2].Get<float>(), fields[3].Get<float>(), fields[4].Get<float>());
5827 }
5828 else
5829 ResurrectPlayer(0.5f);
5830 }
5831
5833}
void RemoveAtLoginFlag(AtLoginFlags flags, bool persist=false)
Definition: Player.cpp:14579
bool HasAtLoginFlag(AtLoginFlags f) const
Definition: Player.h:2412
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition: Player.cpp:4479

References _corpseLocation, Object::ApplyModFlag(), AT_LOGIN_RESURRECT, WorldLocation::GetMapId(), HasAtLoginFlag(), Unit::IsAlive(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, RemoveAtLoginFlag(), ResurrectPlayer(), sMapStore, SpawnCorpseBones(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadFromDB()

bool Player::LoadFromDB ( ObjectGuid  guid,
CharacterDatabaseQueryHolder const &  holder 
)
4919{
4921 //QueryResult* result = CharacterDatabase.Query("SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, "
4922 // 17 18 19 20 21 22 23 24 25 26 27 28 29
4923 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
4924 // 30 31 32 33 34 35 36 37 38 39 40 41 42 43
4925 //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
4926 // 44 45 46 47 48 49 50 51 52 53 54
4927 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
4928 // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
4929 //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles,
4930 // 70 71 72 73 74
4931 //"actionBars, grantableLevels, innTriggerId, extraBonusTalentCount, UNIX_TIMESTAMP(creation_date) FROM characters WHERE guid = '{}'", guid);
4932 PreparedQueryResult result = holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM);
4933
4934 if (!result)
4935 {
4936 LOG_ERROR("entities.player", "Player ({}) not found in table `characters`, can't load. ", playerGuid.ToString());
4937 return false;
4938 }
4939
4940 Field* fields = result->Fetch();
4941
4942 uint32 dbAccountId = fields[1].Get<uint32>();
4943
4944 // check if the character's account in the db and the logged in account match.
4945 // player should be able to load/delete character only with correct account!
4946 if (dbAccountId != GetSession()->GetAccountId())
4947 {
4948 LOG_ERROR("entities.player", "Player ({}) loading from wrong account (is: {}, should be: {})", playerGuid.ToString(), GetSession()->GetAccountId(), dbAccountId);
4949 return false;
4950 }
4951
4952 if (holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANNED))
4953 {
4954 LOG_ERROR("entities.player", "Player ({}) is banned, can't load.", playerGuid.ToString());
4955 return false;
4956 }
4957
4958 ObjectGuid::LowType guid = playerGuid.GetCounter();
4959
4960 Object::_Create(guid, 0, HighGuid::Player);
4961
4962 m_name = fields[2].Get<std::string>();
4963
4964 // check name limitations
4966 {
4968 stmt->SetData(0, uint16(AT_LOGIN_RENAME));
4969 stmt->SetData(1, guid);
4970 CharacterDatabase.Execute(stmt);
4971 return false;
4972 }
4973
4974 uint8 Gender = fields[5].Get<uint8>();
4975 if (!IsValidGender(Gender))
4976 {
4977 LOG_ERROR("entities.player", "Player (GUID: {}) has wrong gender ({}), can't be loaded.", guid, Gender);
4978 return false;
4979 }
4980
4981 // overwrite some data fields
4982 uint32 bytes0 = 0;
4983 bytes0 |= fields[3].Get<uint8>(); // race
4984 bytes0 |= fields[4].Get<uint8>() << 8; // class
4985 bytes0 |= Gender << 16; // gender
4987
4988 m_realRace = fields[3].Get<uint8>(); // set real race
4989 m_race = fields[3].Get<uint8>(); // set real race
4990
4991 SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].Get<uint8>());
4992 SetUInt32Value(PLAYER_XP, fields[7].Get<uint32>());
4993
4994 if (!_LoadIntoDataField(fields[66].Get<std::string>(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE))
4995 {
4996 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid exploredzones data ({}). Forcing partial load.", guid, fields[66].Get<std::string_view>());
4997 }
4998
4999 if (!_LoadIntoDataField(fields[69].Get<std::string>(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2))
5000 {
5001 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid knowntitles mask ({}). Forcing partial load.", guid, fields[69].Get<std::string_view>());
5002 }
5003
5004 SetObjectScale(1.0f);
5006
5007 // load character creation date, relevant for achievements of type average
5008 SetCreationTime(fields[74].Get<Seconds>());
5009
5010 // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria)
5012
5013 uint32 money = fields[8].Get<uint32>();
5014 if (money > MAX_MONEY_AMOUNT)
5015 money = MAX_MONEY_AMOUNT;
5016 SetMoney(money);
5017
5018 SetByteValue(PLAYER_BYTES, 0, fields[9].Get<uint8>());
5019 SetByteValue(PLAYER_BYTES, 1, fields[10].Get<uint8>());
5020 SetByteValue(PLAYER_BYTES, 2, fields[11].Get<uint8>());
5021 SetByteValue(PLAYER_BYTES, 3, fields[12].Get<uint8>());
5022 SetByteValue(PLAYER_BYTES_2, 0, fields[13].Get<uint8>());
5023 SetByteValue(PLAYER_BYTES_2, 2, fields[14].Get<uint8>());
5024 SetByteValue(PLAYER_BYTES_2, 3, fields[15].Get<uint8>());
5025 SetByteValue(PLAYER_BYTES_3, 0, fields[5].Get<uint8>());
5026 SetByteValue(PLAYER_BYTES_3, 1, fields[54].Get<uint8>());
5027 ReplaceAllPlayerFlags((PlayerFlags)fields[16].Get<uint32>());
5028 SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[53].Get<uint32>());
5029
5030 SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[52].Get<uint64>());
5031
5032 SetUInt32Value(PLAYER_AMMO_ID, fields[68].Get<uint32>());
5033
5034 // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise)
5035 SetByteValue(PLAYER_FIELD_BYTES, 2, fields[70].Get<uint8>());
5036
5038
5039 // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory)
5040 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
5041 {
5043 SetVisibleItemSlot(slot, nullptr);
5044
5045 delete m_items[slot];
5046 m_items[slot] = nullptr;
5047 }
5048
5049 LOG_DEBUG("entities.player.loading", "Load Basic value of player {} is: ", m_name);
5051
5052 //Need to call it to initialize m_team (m_team can be calculated from race)
5053 //Other way is to saves m_team into characters table.
5055
5056 // pussywizard: create empty instance bind containers if necessary
5057 sInstanceSaveMgr->PlayerCreateBoundInstancesMaps(playerGuid);
5058
5059 // load home bind and check in same time class/race pair, it used later for restore broken positions
5060 if (!_LoadHomeBind(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_HOME_BIND)))
5061 return false;
5062
5063 InitPrimaryProfessions(); // to max set before any spell loaded
5064
5065 // init saved position, and fix it later if problematic
5066 int32 transLowGUID = fields[35].Get<int32>();
5067 Relocate(fields[17].Get<float>(), fields[18].Get<float>(), fields[19].Get<float>(), fields[21].Get<float>());
5068 uint32 mapId = fields[20].Get<uint16>();
5069 uint32 instanceId = fields[63].Get<uint32>();
5070
5071 uint32 dungeonDiff = fields[43].Get<uint8>() & 0x0F;
5072 if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY)
5073 dungeonDiff = DUNGEON_DIFFICULTY_NORMAL;
5074 uint32 raidDiff = (fields[43].Get<uint8>() >> 4) & 0x0F;
5075 if (raidDiff >= MAX_RAID_DIFFICULTY)
5077 SetDungeonDifficulty(Difficulty(dungeonDiff)); // may be changed in _LoadGroup
5078 SetRaidDifficulty(Difficulty(raidDiff)); // may be changed in _LoadGroup
5079
5080 std::string taxi_nodes = fields[42].Get<std::string>();
5081
5082 auto RelocateToHomebind = [this, &mapId, &instanceId]() { mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); };
5083
5084 _LoadGroup();
5085
5087
5088 SetArenaPoints(fields[44].Get<uint32>());
5089
5090 SetHonorPoints(fields[45].Get<uint32>());
5091 SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[46].Get<uint32>());
5092 SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[47].Get<uint32>());
5093 SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[48].Get<uint32>());
5094 SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[49].Get<uint16>());
5095 SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[50].Get<uint16>());
5096
5099
5100 GetSession()->SetPlayer(this);
5101 MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
5102
5103 Map* map = nullptr;
5104
5105 // pussywizard: group changed difficulty when player was offline, teleport to the enterance of new difficulty
5106 if (mapEntry && ((mapEntry->IsNonRaidDungeon() && dungeonDiff != GetDungeonDifficulty()) || (mapEntry->IsRaid() && raidDiff != GetRaidDifficulty())))
5107 {
5108 bool fixed = false;
5109 if (uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(this, mapId, GetDifficulty(mapEntry->IsRaid())))
5110 {
5111 instanceId = destInstId;
5112 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5113 {
5114 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5115 fixed = true;
5116 }
5117 }
5118 if (!fixed)
5119 {
5120 RelocateToHomebind();
5121 mapEntry = sMapStore.LookupEntry(mapId);
5122 }
5123 }
5124
5125 if (!mapEntry || !IsPositionValid())
5126 {
5127 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (MapId: {} X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5128 RelocateToHomebind();
5129 }
5130 // Player was saved in Arena or Bg
5131 else if (mapEntry->IsBattlegroundOrArena())
5132 {
5133 // xinef: resurrect player, cant log in dead without corpse
5134 {
5137 if (!IsAlive())
5138 ResurrectPlayer(1.0f);
5139 }
5140
5141 const WorldLocation& _loc = GetEntryPoint();
5142 mapId = _loc.GetMapId();
5143 instanceId = 0;
5144
5145 if (mapId == MAPID_INVALID)
5146 {
5147 RelocateToHomebind();
5148 }
5149 else
5150 {
5151 Relocate(&_loc);
5152
5153 // xinef: restore taxi flight from entry point data
5155 {
5159 }
5160 }
5161 }
5162 // currently we do not support transport in bg
5163 else if (transLowGUID != 0)
5164 {
5165 // transLowGUID > 0 ---> motion transport guid
5166 // transLowGUID < 0 ---> static transport spawn id
5167 Transport* transGO = nullptr;
5168 if (transLowGUID > 0)
5169 {
5170 ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Mo_Transport>(transLowGUID);
5171 transGO = HashMapHolder<MotionTransport>::Find(transGUID);
5172 }
5173 else
5174 {
5175 map = sMapMgr->CreateMap(mapId, this);
5176 if (map)
5177 {
5178 auto bounds = map->GetGameObjectBySpawnIdStore().equal_range(std::abs(transLowGUID));
5179 if (bounds.first != bounds.second)
5180 transGO = bounds.first->second->ToTransport();
5181 }
5182 }
5183
5184 // pussywizard: must be on map, for one world tick transport is not in map and has old GetMapId(), player would be added to old map and to the transport, multithreading crashfix
5185 if (transGO && transGO->IsInWorld() && transGO->FindMap())
5186 m_transport = transGO;
5187
5188 if (m_transport)
5189 {
5190 float x = fields[31].Get<float>(), y = fields[32].Get<float>(), z = fields[33].Get<float>(), o = fields[34].Get<float>();
5194
5195 if (!Acore::IsValidMapCoord(x, y, z, o) || std::fabs(m_movementInfo.transport.pos.GetPositionX()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 75.0f)
5196 {
5197 m_transport = nullptr;
5200 RelocateToHomebind();
5201 }
5202 else
5203 {
5204 Relocate(x, y, z, o);
5205 mapId = m_transport->GetMapId();
5208 }
5209 }
5210 else
5211 {
5212 bool fixed = false;
5213 if (mapEntry->Instanceable())
5214 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5215 {
5216 fixed = true;
5217 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5218 }
5219 if (!fixed)
5220 RelocateToHomebind();
5221 }
5222 }
5223 // currently we do not support taxi in instance
5224 else if (!taxi_nodes.empty())
5225 {
5226 instanceId = 0;
5227 if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeamId(true)))
5228 {
5229 // xinef: could no load valid data for taxi, relocate to homebind and clear
5231 RelocateToHomebind();
5232 }
5233 }
5234
5235 // Map could be changed before
5236 mapEntry = sMapStore.LookupEntry(mapId);
5237 // client without expansion support
5238 if (mapEntry)
5239 {
5240 if (GetSession()->Expansion() < mapEntry->Expansion())
5241 {
5242 LOG_DEBUG("entities.player.loading", "Player {} using client without required expansion tried login at non accessible map {}", GetName(), mapId);
5243 RelocateToHomebind();
5244 }
5245
5246 // check whether player was unbound or is bound to another instance
5247 if (instanceId)
5248 {
5249 InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(GetGUID(), mapId, GetDifficulty(mapEntry->IsRaid()));
5250 if (!save || save->GetInstanceId() != instanceId)
5251 instanceId = 0;
5252 }
5253 }
5254
5255 // if the player is in an instance and it has been reset in the meantime teleport him to the entrance
5256 if ((instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId) && !mapEntry->IsBattlegroundOrArena()) || (!instanceId && mapEntry->IsDungeon()))
5257 {
5258 AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId);
5259 if (at)
5261 else
5262 RelocateToHomebind();
5263 }
5264
5265 // NOW player must have valid map
5266 // load the player's map here if it's not already loaded
5267 if (!map)
5268 map = sMapMgr->CreateMap(mapId, this);
5269
5270 if (!map)
5271 {
5272 instanceId = 0;
5273 AreaTriggerTeleport const* at = sObjectMgr->GetGoBackTrigger(mapId);
5274 if (at)
5275 {
5276 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to gobacktrigger (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5278 mapId = at->target_mapId;
5279 }
5280 else
5281 {
5282 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to home (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5283 RelocateToHomebind();
5284 }
5285
5286 map = sMapMgr->CreateMap(mapId, this);
5287 if (!map)
5288 {
5289 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
5290 mapId = info->mapId;
5291 Relocate(info->positionX, info->positionY, info->positionZ, 0.0f);
5292 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5293 map = sMapMgr->CreateMap(mapId, this);
5294 if (!map)
5295 {
5296 LOG_ERROR("entities.player", "Player (guidlow {}) has invalid default map coordinates (X: {} Y: {} Z: {} O: {}). or instance couldn't be created", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5297 return false;
5298 }
5299 }
5300 }
5301
5302 SetMap(map);
5304
5306
5308
5309 time_t now = GameTime::GetGameTime().count();
5310 time_t logoutTime = time_t(fields[27].Get<uint32>());
5311
5312 // since last logout (in seconds)
5313 uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference.
5314
5315 // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]
5316 // this must help in case next save after mass player load after server startup
5317 m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2);
5318
5319 // set value, including drunk invisibility detection
5320 // calculate sobering. after 15 minutes logged out, the player will be sober again
5321 uint8 newDrunkValue = 0;
5322 if (time_diff < uint32(GetDrunkValue()) * 9)
5323 newDrunkValue = GetDrunkValue() - time_diff / 9;
5324
5325 SetDrunkValue(newDrunkValue);
5326
5327 m_cinematic = fields[23].Get<uint8>();
5328 m_Played_time[PLAYED_TIME_TOTAL] = fields[24].Get<uint32>();
5329 m_Played_time[PLAYED_TIME_LEVEL] = fields[25].Get<uint32>();
5330
5331 m_resetTalentsCost = fields[29].Get<uint32>();
5332 m_resetTalentsTime = time_t(fields[30].Get<uint32>());
5333
5334 m_taxi.LoadTaxiMask(fields[22].Get<std::string_view>()); // must be before InitTaxiNodesForLevel
5335
5336 uint32 extraflags = fields[36].Get<uint16>();
5337
5338 _LoadPetStable(fields[37].Get<uint8>(), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS));
5339
5340 m_atLoginFlags = fields[38].Get<uint16>();
5341
5343 {
5344 LOG_ERROR("entities.player", "Player {} tried to login while forced to rename, can't load.'", GetGUID().ToString());
5345 return false;
5346 }
5347
5348 // Honor system
5349 // Update Honor kills data
5350 m_lastHonorUpdateTime = logoutTime;
5352
5353 m_deathExpireTime = time_t(fields[41].Get<uint32>());
5354
5357
5358 // clear channel spell data (if saved at channel spell casting)
5361
5362 // clear charm/summon related fields
5369
5371
5372 // reset some aura modifiers before aura apply
5375
5376 // make sure the unit is considered not in duel for proper loading
5379
5380 // reset stats before loading any modifiers
5384 InitRunes();
5385
5386 sScriptMgr->OnPlayerLoadFromDB(this);
5387
5388 // make sure the unit is considered out of combat for proper loading
5389 ClearInCombat();
5390
5391 // rest bonus can only be calculated after InitStatsForLevel()
5392 _restBonus = fields[26].Get<float>();
5393
5394 if (time_diff > 0)
5395 {
5396 //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour)
5397 float bubble0 = 0.031f;
5398 //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour)
5399 float bubble1 = 0.125f;
5400 float bubble = fields[28].Get<uint8>() > 0
5401 ? bubble1 * sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY)
5402 : bubble0 * sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS);
5403
5404 // Client automatically doubles the value sent so we have to divide it by 2
5405 SetRestBonus(GetRestBonus() + time_diff * ((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 144000)*bubble);
5406 }
5407
5408 uint32 innTriggerId = fields[72].Get<uint32>();
5409 if (innTriggerId)
5410 {
5411 SetRestFlag(REST_FLAG_IN_TAVERN, innTriggerId);
5412 }
5413
5414 // load skills after InitStatsForLevel because it triggering aura apply also
5415 _LoadSkills(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SKILLS));
5416 UpdateSkillsForLevel(); //update skills after load, to make sure they are correctly update at player load
5417
5418 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
5419
5420 m_specsCount = fields[64].Get<uint8>();
5421 m_activeSpec = fields[65].Get<uint8>();
5422
5425
5426 _LoadSpells(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS));
5427 _LoadTalents(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS));
5428
5429 _LoadGlyphs(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS));
5431 _LoadAuras(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), time_diff);
5432 // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura)
5434 {
5435 m_deathState = DeathState::Dead;
5437 }
5438
5439 // pussywizard: remove auras that are removed at map change (after _LoadAuras)
5441
5442 // after spell load, learn rewarded spell if need also
5443 _LoadQuestStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS));
5449 _LoadRandomBGStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG));
5450
5451 // Extra Bonus Talent Points
5452 m_extraBonusTalentCount = fields[73].Get<uint8>();
5453
5454 // after spell, bonus talents, and quest load
5456
5457 // must be before inventory (some items required reputation check)
5459
5460 // xinef: load mails before inventory, so problematic items can be added to already loaded mails
5461 _LoadMail(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAILS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS));
5462
5463 _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), time_diff);
5464
5465 // update items with duration and realtime
5466 UpdateItemDuration(time_diff, true);
5467
5468 _LoadActions(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACTIONS));
5469
5470 m_social = sSocialMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID());
5471
5472 // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
5473 // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
5474 uint32 curTitle = fields[51].Get<uint32>();
5475 if (curTitle && !HasTitle(curTitle))
5476 curTitle = 0;
5477
5479
5480 // has to be called after last Relocate() in Player::LoadFromDB
5482
5484
5485 // Spell code allow apply any auras to dead character in load time in aura/spell/item loading
5486 // Do now before stats re-calculation cleanup for ghost state unexpected auras
5487 if (!IsAlive())
5489 else
5491
5492 //apply all stat bonuses from items and auras
5493 SetCanModifyStats(true);
5495
5496 // restore remembered power/health values (but not more max values)
5497 uint32 savedHealth = fields[55].Get<uint32>();
5498 SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
5499 for (uint8 i = 0; i < MAX_POWERS; ++i)
5500 {
5501 uint32 savedPower = fields[56 + i].Get<uint32>();
5502 SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower);
5503 }
5504
5505 LOG_DEBUG("entities.player.loading", "The value of player {} after load item and aura is: ", m_name);
5507
5508 // GM state
5510 {
5511 switch (sWorld->getIntConfig(CONFIG_GM_LOGIN_STATE))
5512 {
5513 default:
5514 case 0:
5515 break; // disable
5516 case 1:
5517 SetGameMaster(true);
5518 break; // enable
5519 case 2: // save state
5520 if (extraflags & PLAYER_EXTRA_GM_ON)
5521 SetGameMaster(true);
5522 break;
5523 }
5524
5525 switch (sWorld->getIntConfig(CONFIG_GM_VISIBLE_STATE))
5526 {
5527 default:
5528 case 0:
5529 SetGMVisible(false);
5530 break; // invisible
5531 case 1:
5532 break; // visible
5533 case 2: // save state
5534 if (extraflags & PLAYER_EXTRA_GM_INVISIBLE)
5535 SetGMVisible(false);
5536 break;
5537 }
5538
5539 switch (sWorld->getIntConfig(CONFIG_GM_CHAT))
5540 {
5541 default:
5542 case 0:
5543 break; // disable
5544 case 1:
5545 SetGMChat(true);
5546 break; // enable
5547 case 2: // save state
5548 if (extraflags & PLAYER_EXTRA_GM_CHAT)
5549 SetGMChat(true);
5550 break;
5551 }
5552
5553 switch (sWorld->getIntConfig(CONFIG_GM_WHISPERING_TO))
5554 {
5555 default:
5556 case 0:
5557 break; // disable
5558 case 1:
5559 SetAcceptWhispers(true);
5560 break; // enable
5561 case 2: // save state
5562 if (extraflags & PLAYER_EXTRA_ACCEPT_WHISPERS)
5563 SetAcceptWhispers(true);
5564 break;
5565 }
5566 }
5567
5568 // RaF stuff.
5569 m_grantableLevels = fields[71].Get<uint8>();
5570 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
5572
5573 if (m_grantableLevels > 0)
5575
5577
5578 //m_achievementMgr->CheckAllAchievementCriteria(); // pussywizard: disabled this
5579
5581
5583
5585
5586 // Players are immune to taunt
5589
5590 // Init charm info
5592
5593 // Fix aurastate auras, depending on health!
5594 // Set aurastate manualy, prevents aura switching
5595 if (HealthBelowPct(20))
5597 if (HealthBelowPct(35))
5599 if (HealthAbovePct(75))
5601
5602 // unapply aura stats if dont meet requirements
5603 AuraApplicationMap const& Auras = GetAppliedAuras();
5604 for (AuraApplicationMap::const_iterator itr = Auras.begin(); itr != Auras.end(); ++itr)
5605 {
5606 // we assume that all auras are applied now, aurastate was modfied MANUALY preventing any apply/unapply state switching
5607 Aura* aura = itr->second->GetBase();
5608 SpellInfo const* m_spellInfo = aura->GetSpellInfo();
5612 continue;
5613
5614 if (!HasAuraState((AuraStateType)m_spellInfo->CasterAuraState))
5615 aura->HandleAllEffects(itr->second, AURA_EFFECT_HANDLE_REAL, false);
5616 }
5617 return true;
5618}
@ UNIT_FIELD_CHANNEL_OBJECT
Definition: UpdateFields.h:93
@ UNIT_FIELD_SUMMON
Definition: UpdateFields.h:87
@ UNIT_FIELD_CHARMEDBY
Definition: UpdateFields.h:89
@ UNIT_FIELD_CHARM
Definition: UpdateFields.h:86
@ PLAYER_TRACK_CREATURES
Definition: UpdateFields.h:344
@ PLAYER_TRACK_RESOURCES
Definition: UpdateFields.h:345
@ UNIT_CHANNEL_SPELL
Definition: UpdateFields.h:94
@ MOVEMENTFLAG_ONTRANSPORT
Definition: UnitDefines.h:374
@ UNIT_FLAG2_FORCE_MOVEMENT
Definition: UnitDefines.h:295
@ UNIT_STATE_ISOLATED
Definition: UnitDefines.h:183
@ REST_FLAG_IN_TAVERN
Definition: Player.h:820
@ PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS
Definition: Player.h:882
@ PLAYER_LOGIN_QUERY_LOAD_GLYPHS
Definition: Player.h:888
@ PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES
Definition: Player.h:883
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW
Definition: Player.h:895
@ PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS
Definition: Player.h:874
@ PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS
Definition: Player.h:901
@ PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES
Definition: Player.h:896
@ PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS
Definition: Player.h:897
@ PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST
Definition: Player.h:880
@ PLAYER_LOGIN_QUERY_LOAD_ACTIONS
Definition: Player.h:877
@ PLAYER_LOGIN_QUERY_LOAD_SKILLS
Definition: Player.h:891
@ PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS
Definition: Player.h:879
@ PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS
Definition: Player.h:902
@ PLAYER_LOGIN_QUERY_LOAD_INVENTORY
Definition: Player.h:876
@ PLAYER_LOGIN_QUERY_LOAD_REPUTATION
Definition: Player.h:875
@ PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH
Definition: Player.h:899
@ PLAYER_LOGIN_QUERY_LOAD_FROM
Definition: Player.h:870
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS
Definition: Player.h:873
@ PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT
Definition: Player.h:887
@ PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES
Definition: Player.h:903
@ PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS
Definition: Player.h:892
@ PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS
Definition: Player.h:898
@ PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS
Definition: Player.h:886
@ PLAYER_LOGIN_QUERY_LOAD_MAILS
Definition: Player.h:878
@ PLAYER_LOGIN_QUERY_LOAD_AURAS
Definition: Player.h:871
@ PLAYER_LOGIN_QUERY_LOAD_TALENTS
Definition: Player.h:889
@ PLAYER_LOGIN_QUERY_LOAD_BANNED
Definition: Player.h:894
@ PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS
Definition: Player.h:885
@ PLAYER_LOGIN_QUERY_LOAD_HOME_BIND
Definition: Player.h:881
@ PLAYER_LOGIN_QUERY_LOAD_SPELLS
Definition: Player.h:872
@ PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG
Definition: Player.h:893
@ PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS
Definition: Player.h:884
@ AURA_INTERRUPT_FLAG_CHANGE_MAP
Definition: SpellDefines.h:62
@ SPELL_AURA_MOD_TAUNT
Definition: SpellAuraDefines.h:74
@ CONFIG_GM_CHAT
Definition: IWorld.h:257
@ CONFIG_GM_WHISPERING_TO
Definition: IWorld.h:258
@ CONFIG_GM_LOGIN_STATE
Definition: IWorld.h:254
@ CONFIG_GM_VISIBLE_STATE
Definition: IWorld.h:255
@ RATE_REST_OFFLINE_IN_WILDERNESS
Definition: IWorld.h:509
@ RATE_REST_OFFLINE_IN_TAVERN_OR_CITY
Definition: IWorld.h:508
@ CHAR_UPD_ADD_AT_LOGIN_FLAG
Definition: CharacterDatabase.h:276
#define MAX_RAID_DIFFICULTY
Definition: DBCEnums.h:282
#define MAX_DUNGEON_DIFFICULTY
Definition: DBCEnums.h:281
@ SPELL_EFFECT_ATTACK_ME
Definition: SharedDefines.h:892
@ CHAR_NAME_SUCCESS
Definition: SharedDefines.h:3435
@ UNIT_DYNFLAG_REFER_A_FRIEND
Definition: SharedDefines.h:3127
@ IMMUNITY_STATE
Definition: SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1394
bool IsValidMapCoord(float c)
Definition: GridDefines.h:206
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult)
Definition: AchievementMgr.cpp:618
Transport * ToTransport()
Definition: GameObject.h:320
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:124
bool _LoadIntoDataField(std::string const &data, uint32 startOffset, uint32 count)
Definition: Object.cpp:612
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:339
struct MovementInfo::TransportInfo transport
void Reset()
Definition: Object.h:293
ObjectGuid guid
Definition: Object.h:302
Position pos
Definition: Object.h:303
Transport * m_transport
Definition: Object.h:659
bool IsPositionValid() const
Definition: Position.cpp:176
void ClearTaxiPath()
Definition: Player.h:1065
bool HasTaxiPath() const
Definition: Player.h:1066
void _LoadDeclinedNames(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4785
void _LoadGlyphs(PreparedQueryResult result)
Definition: Player.cpp:14899
void SetRestFlag(RestFlag restFlag, uint32 triggerId=0)
Definition: Player.cpp:16091
void SetCreationTime(Seconds creationTime)
Definition: Player.h:2548
void SetGameMaster(bool on)
Definition: Player.cpp:2213
void _LoadQuestStatusRewarded(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6315
void _LoadAuras(PreparedQueryResult result, uint32 timediff)
Definition: PlayerStorage.cpp:5700
void _LoadSeasonalQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6423
void _LoadGroup()
Definition: PlayerStorage.cpp:6481
void _LoadCharacterSettings(PreparedQueryResult result)
Definition: PlayerSettings.cpp:26
void _LoadTalents(PreparedQueryResult result)
Definition: Player.cpp:14948
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2346
void _LoadPetStable(uint8 petStableSlots, PreparedQueryResult result)
Definition: Player.cpp:15760
void _LoadBrewOfTheMonth(PreparedQueryResult result)
Definition: Player.cpp:15723
WorldLocation const & GetEntryPoint() const
Definition: Player.h:2387
void outDebugValues() const
Definition: PlayerStorage.cpp:7782
void _LoadRandomBGStatus(PreparedQueryResult result)
Definition: Player.cpp:15658
void SaveRecallPosition()
Definition: Player.cpp:5668
void _LoadQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6228
void _LoadMonthlyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6446
void SetGMChat(bool on)
Definition: Player.h:1179
void _LoadArenaTeamInfo()
Definition: PlayerStorage.cpp:4796
bool _LoadHomeBind(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6988
void UpdateItemDuration(uint32 time, bool realtimeonly=false)
Definition: PlayerStorage.cpp:4145
void _LoadSpells(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6468
void _LoadSkills(PreparedQueryResult result)
Definition: Player.cpp:13617
void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
Definition: PlayerStorage.cpp:6155
void _LoadWeeklyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6401
void SetGMVisible(bool on)
Definition: Player.cpp:2282
void PrepareCharmAISpells()
Definition: Player.cpp:15354
void _LoadGlyphAuras()
Definition: PlayerStorage.cpp:5783
void ReplaceAllPlayerFlags(PlayerFlags flags)
Definition: Player.h:1129
void _LoadEquipmentSets(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4827
void _LoadEntryPointData(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4858
void _LoadInstanceTimeRestrictions(PreparedQueryResult result)
Definition: Player.cpp:15711
void StoreRaidMapDifficulty()
Definition: Player.h:1934
void _LoadInventory(PreparedQueryResult result, uint32 timeDiff)
Definition: PlayerStorage.cpp:5835
void UpdateHonorFields()
Definition: PlayerUpdates.cpp:1182
void _LoadSpellCooldowns(PreparedQueryResult result)
Definition: Player.cpp:3587
void SetMoney(uint32 value)
Definition: Player.h:1627
void _LoadDailyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6350
bool LoadTaxiMask(std::string_view data)
Definition: PlayerTaxi.cpp:89
bool LoadTaxiDestinationsFromString(std::string const &values, TeamId teamId)
Definition: PlayerTaxi.cpp:130
virtual void AddPassenger(WorldObject *passenger, bool withAll=false)=0
void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied transport offsets into global coordinates.
Definition: Transport.h:33
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:1039
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13433
void RemoveAllAurasRequiringDeadTarget()
Definition: Unit.cpp:5405
DeathState m_deathState
Definition: Unit.h:2057
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5382
void AddUnitState(uint32 f)
Definition: Unit.h:690
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:1037
void AddUnitMovementFlag(uint32 f)
Definition: Unit.h:727
void RemoveUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:710
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10617
void ClearInCombat()
Definition: Unit.cpp:13860
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:671
bool HasSpiritOfRedemptionAura() const
Definition: Unit.h:1709
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5214
static T * Find(ObjectGuid guid)
Definition: ObjectAccessor.cpp:53
Definition: ObjectMgr.h:411
float target_Z
Definition: ObjectMgr.h:415
float target_X
Definition: ObjectMgr.h:413
float target_Orientation
Definition: ObjectMgr.h:416
float target_Y
Definition: ObjectMgr.h:414
uint32 target_mapId
Definition: ObjectMgr.h:412
static uint8 CheckPlayerName(std::string_view name, bool create=false)
Definition: ObjectMgr.cpp:8605
uint32 GetInstanceId() const
Definition: InstanceSaveMgr.h:61
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
Definition: Map.h:370
void LoadFromDB(PreparedQueryResult result)
Definition: ReputationMgr.cpp:561
void SetPlayer(Player *player)
Definition: WorldSession.cpp:1282
bool IsARecruiter() const
Definition: WorldSession.h:541
uint32 CasterAuraState
Definition: SpellInfo.h:339
bool IsNonRaidDungeon() const
Definition: DBCStructure.h:1353
uint32 Expansion() const
Definition: DBCStructure.h:1350
bool IsBattlegroundOrArena() const
Definition: DBCStructure.h:1358
bool IsDungeon() const
Definition: DBCStructure.h:1352
bool IsRaid() const
Definition: DBCStructure.h:1355
bool Instanceable() const
Definition: DBCStructure.h:1354

References Object::_Create(), _LoadActions(), _LoadArenaTeamInfo(), _LoadAuras(), _LoadBrewOfTheMonth(), _LoadCharacterSettings(), _LoadDailyQuestStatus(), _LoadDeclinedNames(), _LoadEntryPointData(), _LoadEquipmentSets(), _LoadGlyphAuras(), _LoadGlyphs(), _LoadGroup(), _LoadHomeBind(), _LoadInstanceTimeRestrictions(), Object::_LoadIntoDataField(), _LoadInventory(), _LoadMail(), _LoadMonthlyQuestStatus(), _LoadPetStable(), _LoadQuestStatus(), _LoadQuestStatusRewarded(), _LoadRandomBGStatus(), _LoadSeasonalQuestStatus(), _LoadSkills(), _LoadSpellCooldowns(), _LoadSpells(), _LoadTalents(), _LoadWeeklyQuestStatus(), _restBonus, Transport::AddPassenger(), PlayerTaxi::AddTaxiDestination(), Unit::AddUnitMovementFlag(), Unit::AddUnitState(), Unit::ApplySpellImmune(), AT_LOGIN_RENAME, AURA_EFFECT_HANDLE_REAL, AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Transport::CalculatePassengerPosition(), SpellInfo::CasterAuraState, CHAR_NAME_SUCCESS, CHAR_UPD_ADD_AT_LOGIN_FLAG, CharacterDatabase, ObjectMgr::CheckPlayerName(), Unit::ClearInCombat(), PlayerTaxi::ClearTaxiDestinations(), EntryPointData::ClearTaxiPath(), CONFIG_GM_CHAT, CONFIG_GM_LOGIN_STATE, CONFIG_GM_VISIBLE_STATE, CONFIG_GM_WHISPERING_TO, DEATH_EXPIRE_STEP, DUNGEON_DIFFICULTY_NORMAL, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, MapEntry::Expansion(), HashMapHolder< T >::Find(), WorldObject::FindMap(), Field::Get(), WorldSession::GetAccountId(), Unit::GetAppliedAuras(), Unit::getClass(), ObjectGuid::GetCounter(), GetDifficulty(), GetDrunkValue(), GetDungeonDifficulty(), GetEntryPoint(), Map::GetGameObjectBySpawnIdStore(), GameTime::GetGameTime(), Object::GetGUID(), InstanceSave::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMaxHealth(), Unit::GetMaxPower(), WorldObject::GetName(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), SQLQueryHolderBase::GetPreparedResult(), Unit::getRace(), GetRaidDifficulty(), WorldSession::GetRecruiterId(), GetRestBonus(), GetSession(), Aura::GetSpellInfo(), GetTeamId(), Object::GetUInt32Value(), MovementInfo::TransportInfo::guid, Aura::HandleAllEffects(), HasAtLoginFlag(), Unit::HasAuraState(), HasPlayerFlag(), Unit::HasSpiritOfRedemptionAura(), EntryPointData::HasTaxiPath(), HasTitle(), Unit::HealthAbovePct(), Unit::HealthBelowPct(), IMMUNITY_EFFECT, IMMUNITY_STATE, InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), MapEntry::Instanceable(), Unit::IsAlive(), WorldSession::IsARecruiter(), MapEntry::IsBattlegroundOrArena(), MapEntry::IsDungeon(), Object::IsInWorld(), MapEntry::IsNonRaidDungeon(), AccountMgr::IsPlayerAccount(), Position::IsPositionValid(), MapEntry::IsRaid(), IsValidGender(), Acore::IsValidMapCoord(), KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), AchievementMgr::LoadFromDB(), ReputationMgr::LoadFromDB(), PlayerTaxi::LoadTaxiDestinationsFromString(), PlayerTaxi::LoadTaxiMask(), LOG_DEBUG, LOG_ERROR, LOG_WARN, m_achievementMgr, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, Unit::m_deathState, m_entryPointData, m_extraBonusTalentCount, m_grantableLevels, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_items, m_lastHonorUpdateTime, WorldObject::m_movementInfo, WorldObject::m_name, m_nextSave, m_Played_time, Unit::m_race, Unit::m_realRace, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_social, m_specsCount, m_taxi, WorldObject::m_transport, PlayerInfo::mapId, MAPID_INVALID, MAX_DEATH_COUNT, MAX_DUNGEON_DIFFICULTY, MAX_MONEY_AMOUNT, MAX_POWERS, MAX_RAID_DIFFICULTY, MOVEMENTFLAG_ONTRANSPORT, outDebugValues(), PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_EXTRA_ACCEPT_WHISPERS, PLAYER_EXTRA_GM_CHAT, PLAYER_EXTRA_GM_INVISIBLE, PLAYER_EXTRA_GM_ON, PLAYER_FARSIGHT, PLAYER_FIELD_BYTES, PLAYER_FIELD_INV_SLOT_HEAD, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_GHOST, PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS, PLAYER_LOGIN_QUERY_LOAD_ACTIONS, PLAYER_LOGIN_QUERY_LOAD_AURAS, PLAYER_LOGIN_QUERY_LOAD_BANNED, PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH, PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS, PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS, PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES, PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT, PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, PLAYER_LOGIN_QUERY_LOAD_FROM, PLAYER_LOGIN_QUERY_LOAD_GLYPHS, PLAYER_LOGIN_QUERY_LOAD_HOME_BIND, PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES, PLAYER_LOGIN_QUERY_LOAD_INVENTORY, PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS, PLAYER_LOGIN_QUERY_LOAD_MAILS, PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES, PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW, PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG, PLAYER_LOGIN_QUERY_LOAD_REPUTATION, PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_SKILLS, PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST, PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS, PLAYER_LOGIN_QUERY_LOAD_SPELLS, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS, PLAYER_NEXT_LEVEL_XP, PLAYER_TRACK_CREATURES, PLAYER_TRACK_RESOURCES, PLAYER_XP, MovementInfo::TransportInfo::pos, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PrepareCharmAISpells(), RAID_DIFFICULTY_10MAN_NORMAL, RATE_REST_OFFLINE_IN_TAVERN_OR_CITY, RATE_REST_OFFLINE_IN_WILDERNESS, Position::Relocate(), Unit::RemoveAllAurasOnDeath(), Unit::RemoveAllAurasRequiringDeadTarget(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Unit::RemoveUnitFlag2(), ReplaceAllPlayerFlags(), MovementInfo::TransportInfo::Reset(), REST_FLAG_IN_TAVERN, ResurrectPlayer(), SaveRecallPosition(), SetAcceptWhispers(), SetArenaPoints(), Object::SetByteValue(), Unit::SetCanModifyStats(), SetCreationTime(), Unit::SetCreatorGUID(), PreparedStatementBase::SetData(), SetDrunkValue(), SetDungeonDifficulty(), Object::SetDynamicFlag(), SetFactionForRace(), SetFallInformation(), Object::SetFlag(), Object::SetFloatValue(), SetGameMaster(), SetGMChat(), SetGMVisible(), Object::SetGuidValue(), Unit::SetHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), SetMoney(), SetObjectScale(), Unit::SetOwnerGUID(), WorldSession::SetPlayer(), Unit::SetPower(), SetRaidDifficulty(), SetRestBonus(), SetRestFlag(), Object::SetUInt16Value(), Unit::SetUInt32Value(), Object::SetUInt64Value(), SetVisibleItemSlot(), sInstanceSaveMgr, sMapMgr, sMapStore, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOD_TAUNT, SPELL_EFFECT_ATTACK_ME, sScriptMgr, sSocialMgr, StoreRaidMapDifficulty(), sWorld, AreaTriggerTeleport::target_mapId, AreaTriggerTeleport::target_Orientation, AreaTriggerTeleport::target_X, AreaTriggerTeleport::target_Y, AreaTriggerTeleport::target_Z, EntryPointData::taxiPath, ObjectGuid::ToString(), Position::ToString(), GameObject::ToTransport(), MovementInfo::transport, UNIT_CHANNEL_SPELL, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_AURASTATE, UNIT_FIELD_BYTES_0, UNIT_FIELD_CHANNEL_OBJECT, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FIELD_SUMMON, UNIT_FLAG2_FORCE_MOVEMENT, UNIT_STATE_ISOLATED, UpdateAllStats(), UpdateHonorFields(), UpdateItemDuration(), WorldObject::UpdatePositionData(), UpdateSkillsForLevel(), and urand().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPet()

void Player::LoadPet ( )
6217{
6218 //fixme: the pet should still be loaded if the player is not in world
6219 // just not added to the map
6220 if (m_petStable && IsInWorld())
6221 {
6222 Pet* pet = new Pet(this);
6223 if (!pet->LoadPetFromDB(this, 0, 0, true))
6224 delete pet;
6225 }
6226}
bool LoadPetFromDB(Player *owner, uint32 petEntry, uint32 petnumber, bool current, uint32 healthPct=0, bool fullMana=false)
Definition: Pet.cpp:216

References Object::IsInWorld(), Pet::LoadPetFromDB(), and m_petStable.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPositionFromDB()

bool Player::LoadPositionFromDB ( uint32 mapid,
float &  x,
float &  y,
float &  z,
float &  o,
bool &  in_flight,
ObjectGuid::LowType  guid 
)
static
4876{
4878 stmt->SetData(0, guid);
4879 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4880
4881 if (!result)
4882 return false;
4883
4884 Field* fields = result->Fetch();
4885
4886 x = fields[0].Get<float>();
4887 y = fields[1].Get<float>();
4888 z = fields[2].Get<float>();
4889 o = fields[3].Get<float>();
4890 mapid = fields[4].Get<uint16>();
4891 in_flight = !fields[5].Get<std::string>().empty();
4892
4893 return true;
4894}
@ CHAR_SEL_CHAR_POSITION
Definition: CharacterDatabase.h:54

References CHAR_SEL_CHAR_POSITION, CharacterDatabase, Field::Get(), and PreparedStatementBase::SetData().

Referenced by misc_commandscript::HandleAppearCommand().

◆ ModifyArenaPoints()

void Player::ModifyArenaPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)

If trans is specified, honor save query will be added to trans.

6309{
6310 int32 newValue = int32(GetArenaPoints()) + value;
6311 if (newValue < 0)
6312 newValue = 0;
6313 SetArenaPoints(uint32(newValue));
6314
6315 if (trans)
6316 {
6318 stmt->SetData(0, newValue);
6319 stmt->SetData(1, GetGUID().GetCounter());
6320 trans->Append(stmt);
6321 }
6322}
@ CHAR_UDP_CHAR_ARENA_POINTS
Definition: CharacterDatabase.h:427

References CHAR_UDP_CHAR_ARENA_POINTS, CharacterDatabase, GetArenaPoints(), Object::GetGUID(), SetArenaPoints(), and PreparedStatementBase::SetData().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyArenaCommand(), RefundItem(), and RewardQuest().

◆ ModifyHonorPoints()

void Player::ModifyHonorPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)
6293{
6294 int32 newValue = int32(GetHonorPoints()) + value;
6295 if (newValue < 0)
6296 newValue = 0;
6297 SetHonorPoints(uint32(newValue));
6298
6299 if (trans)
6300 {
6302 stmt->SetData(0, newValue);
6303 stmt->SetData(1, GetGUID().GetCounter());
6304 trans->Append(stmt);
6305 }
6306}
@ CHAR_UDP_CHAR_HONOR_POINTS
Definition: CharacterDatabase.h:425

References CHAR_UDP_CHAR_HONOR_POINTS, CharacterDatabase, Object::GetGUID(), GetHonorPoints(), PreparedStatementBase::SetData(), and SetHonorPoints().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyHonorCommand(), RefundItem(), and RewardHonor().

◆ ModifyMoney()

bool Player::ModifyMoney ( int32  amount,
bool  sendError = true 
)
11464{
11465 if (!amount)
11466 return true;
11467
11468 sScriptMgr->OnPlayerMoneyChanged(this, amount);
11469
11470 if (amount < 0)
11471 SetMoney (GetMoney() > uint32(-amount) ? GetMoney() + amount : 0);
11472 else
11473 {
11474 if (GetMoney() < uint32(MAX_MONEY_AMOUNT - amount))
11475 SetMoney(GetMoney() + amount);
11476 else
11477 {
11478 if (sendError)
11479 SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, nullptr, nullptr);
11480 return false;
11481 }
11482 }
11483
11484 return true;
11485}
@ EQUIP_ERR_TOO_MUCH_GOLD
Definition: Item.h:123

References EQUIP_ERR_TOO_MUCH_GOLD, GetMoney(), MAX_MONEY_AMOUNT, SendEquipError(), SetMoney(), and sScriptMgr.

Referenced by _StoreOrEquipNewItem(), ActivateTaxiPathTo(), FlightPathMovementGenerator::DoUpdate(), DurabilityRepair(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyBankSlotOpcode(), Guild::HandleBuyBankTab(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), modify_commandscript::HandleModifyMoneyCommand(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), Guild::HandleSetEmblem(), WorldSession::HandleTrainerBuySpellOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), ProcessCastaction(), ProcessUnlearnAction(), RefundItem(), resetTalents(), RewardQuest(), and SetHonorPoints().

◆ ModifySkillBonus()

void Player::ModifySkillBonus ( uint32  skillid,
int32  val,
bool  talent 
)
5318{
5319 SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
5320 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5321 return;
5322
5323 uint32 bonusIndex = PLAYER_SKILL_BONUS_INDEX(itr->second.pos);
5324
5325 uint32 bonus_val = GetUInt32Value(bonusIndex);
5326 int16 temp_bonus = SKILL_TEMP_BONUS(bonus_val);
5327 int16 perm_bonus = SKILL_PERM_BONUS(bonus_val);
5328
5329 if (talent) // permanent bonus stored in high part
5330 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus, perm_bonus + val));
5331 else // temporary/item bonus stored in low part
5332 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus + val, perm_bonus));
5333}
#define MAKE_SKILL_BONUS(t, p)
Definition: Player.h:88

References Object::GetUInt32Value(), MAKE_SKILL_BONUS, mSkillStatus, PLAYER_SKILL_BONUS_INDEX, Unit::SetUInt32Value(), SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_TEMP_BONUS.

Referenced by AuraEffect::HandleAuraModSkill().

◆ ModifySpellCooldown()

void Player::ModifySpellCooldown ( uint32  spellId,
int32  cooldown 
)
11042{
11043 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellId);
11044 if (itr == m_spellCooldowns.end())
11045 return;
11046
11047 itr->second.end += cooldown;
11048
11049 WorldPacket data(SMSG_MODIFY_COOLDOWN, 4 + 8 + 4);
11050 data << uint32(spellId); // Spell ID
11051 data << GetGUID(); // Player GUID
11052 data << int32(cooldown); // Cooldown mod in milliseconds
11053 GetSession()->SendPacket(&data);
11054}
@ SMSG_MODIFY_COOLDOWN
Definition: Opcodes.h:1199

References Object::GetGUID(), GetSession(), m_spellCooldowns, WorldSession::SendPacket(), and SMSG_MODIFY_COOLDOWN.

◆ MoneyChanged()

void Player::MoneyChanged ( uint32  value)
2172{
2173 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2174 {
2175 uint32 questid = GetQuestSlotQuestId(i);
2176 if (!questid)
2177 continue;
2178
2179 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2180 {
2181 int32 rewOrReqMoney = qInfo->GetRewOrReqMoney();
2182 if (rewOrReqMoney < 0)
2183 {
2184 QuestStatusData& q_status = m_QuestStatus[questid];
2185
2186 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2187 {
2188 if (int32(count) >= -rewOrReqMoney)
2189 {
2190 if (CanCompleteQuest(questid))
2191 {
2192 CompleteQuest(questid);
2193 }
2194 }
2195 }
2196 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2197 {
2198 if (int32(count) < -rewOrReqMoney)
2199 {
2200 IncompleteQuest(questid);
2201 }
2202 }
2203 }
2204 }
2205 }
2206}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by SetMoney().

◆ MoveItemFromInventory()

void Player::MoveItemFromInventory ( uint8  bag,
uint8  slot,
bool  update 
)
2979{
2980 if (Item* it = GetItemByPos(bag, slot))
2981 {
2982 ItemRemovedQuestCheck(it->GetEntry(), it->GetCount());
2983 RemoveItem(bag, slot, update);
2985 it->SetNotRefundable(this, false);
2986 it->RemoveFromUpdateQueueOf(this);
2987 if (it->IsInWorld())
2988 {
2989 it->RemoveFromWorld();
2990 it->DestroyForPlayer(this);
2991 }
2992
2993 sScriptMgr->OnPlayerAfterMoveItemFromInventory(this, it, bag, slot, update);
2994 }
2995}

References GetItemByPos(), ItemRemovedQuestCheck(), RemoveItem(), sScriptMgr, and UpdateTitansGrip().

Referenced by AutoUnequipOffhandIfNeed(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionSellItem(), and WorldSession::HandleSendMail().

◆ MoveItemToInventory()

void Player::MoveItemToInventory ( ItemPosCountVec const &  dest,
Item pItem,
bool  update,
bool  in_characterInventoryDB = false 
)
2999{
3000 // update quest counters
3001 ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3003
3004 // store item
3005 Item* pLastItem = StoreItem(dest, pItem, update);
3006
3007 // only set if not merged to existed stack (pItem can be deleted already but we can compare pointers any way)
3008 if (pLastItem == pItem)
3009 {
3010 // update owner for last item (this can be original item with wrong owner
3011 if (pLastItem->GetOwnerGUID() != GetGUID())
3012 pLastItem->SetOwnerGUID(GetGUID());
3013
3014 // if this original item then it need create record in inventory
3015 // in case trade we already have item in other player inventory
3016 pLastItem->SetState(in_characterInventoryDB ? ITEM_CHANGED : ITEM_NEW, this);
3017
3018 if (pLastItem->IsBOPTradable())
3019 AddTradeableItem(pLastItem);
3020 }
3021}
ObjectGuid GetOwnerGUID() const
Definition: Item.h:231

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, AddTradeableItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetOwnerGUID(), Item::IsBOPTradable(), ITEM_CHANGED, ITEM_NEW, ItemAddedQuestCheck(), Item::SetOwnerGUID(), Item::SetState(), StoreItem(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMailTakeItem(), and WorldSession::moveItems().

◆ MustDelayTeleport()

bool Player::MustDelayTeleport ( ) const
inlineprivate
2958{ return m_bMustDelayTeleport; } // pussywizard: must delay teleports during player update to the very end

References m_bMustDelayTeleport.

Referenced by TeleportTo().

◆ NeedSendSpectatorData()

bool Player::NeedSendSpectatorData ( ) const
15343{
15344 if (FindMap() && FindMap()->IsBattleArena() && !IsSpectator())
15345 {
15346 Battleground* bg = ((BattlegroundMap*)FindMap())->GetBG();
15347 if (bg && bg->HaveSpectators() && bg->GetStatus() == STATUS_IN_PROGRESS && !bg->GetPlayers().empty())
15348 if (bg->GetPlayers().find(GetGUID()) != bg->GetPlayers().end())
15349 return true;
15350 }
15351 return false;
15352}
bool HaveSpectators()
Definition: Battleground.h:398
BattlegroundPlayerMap const & GetPlayers() const
Definition: Battleground.h:409
bool IsSpectator() const
Definition: Player.h:2586
Definition: Map.h:686

References WorldObject::FindMap(), Object::GetGUID(), Battleground::GetPlayers(), Battleground::GetStatus(), Battleground::HaveSpectators(), IsSpectator(), and STATUS_IN_PROGRESS.

Referenced by _AddSpellCooldown(), Spell::cancel(), RemovePet(), Spell::SendChannelStart(), SendClearCooldown(), Spell::SendSpellStart(), setDeathState(), Unit::SetHealth(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), SetSelection(), and SummonPet().

◆ NeedToSaveGlyphs()

bool Player::NeedToSaveGlyphs ( )
inline
2611{ return m_NeedToSaveGlyphs; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs().

◆ OCTRegenHPPerSpirit()

float Player::OCTRegenHPPerSpirit ( )
5226{
5227 uint8 level = GetLevel();
5228 uint32 pclass = getClass();
5229
5230 if (level > GT_MAX_LEVEL)
5231 level = GT_MAX_LEVEL;
5232
5233 GtOCTRegenHPEntry const* baseRatio = sGtOCTRegenHPStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5234 GtRegenHPPerSptEntry const* moreRatio = sGtRegenHPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5235 if (!baseRatio || !moreRatio)
5236 return 0.0f;
5237
5238 // Formula from PaperDollFrame script
5239 float spirit = GetStat(STAT_SPIRIT);
5240 float baseSpirit = spirit;
5241 if (baseSpirit > 50)
5242 baseSpirit = 50;
5243 float moreSpirit = spirit - baseSpirit;
5244 float regen = (baseSpirit * baseRatio->ratio + moreSpirit * moreRatio->ratio) * 2;
5245 return regen;
5246}
DBCStorage< GtRegenHPPerSptEntry > sGtRegenHPPerSptStore(GtRegenHPPerSptfmt)
DBCStorage< GtOCTRegenHPEntry > sGtOCTRegenHPStore(GtOCTRegenHPfmt)
Definition: DBCStructure.h:1083
float ratio
Definition: DBCStructure.h:1084
Definition: DBCStructure.h:1093
float ratio
Definition: DBCStructure.h:1094

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtOCTRegenHPEntry::ratio, GtRegenHPPerSptEntry::ratio, sGtOCTRegenHPStore, sGtRegenHPPerSptStore, and STAT_SPIRIT.

Referenced by RegenerateHealth().

◆ OCTRegenMPPerSpirit()

float Player::OCTRegenMPPerSpirit ( )
5249{
5250 uint8 level = GetLevel();
5251 uint32 pclass = getClass();
5252
5253 if (level > GT_MAX_LEVEL)
5254 level = GT_MAX_LEVEL;
5255
5256 // GtOCTRegenMPEntry const* baseRatio = sGtOCTRegenMPStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1);
5257 GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5258 if (!moreRatio)
5259 return 0.0f;
5260
5261 // Formula get from PaperDollFrame script
5262 float spirit = GetStat(STAT_SPIRIT);
5263 float regen = spirit * moreRatio->ratio;
5264 return regen;
5265}
DBCStorage< GtRegenMPPerSptEntry > sGtRegenMPPerSptStore(GtRegenMPPerSptfmt)
Definition: DBCStructure.h:1098
float ratio
Definition: DBCStructure.h:1099

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtRegenMPPerSptEntry::ratio, sGtRegenMPPerSptStore, and STAT_SPIRIT.

Referenced by UpdateManaRegen().

◆ OfflineResurrect()

◆ OnGossipSelect()

void Player::OnGossipSelect ( WorldObject source,
uint32  gossipListId,
uint32  menuId 
)
245{
247
248 // if not same, then something funky is going on
249 if (menuId != gossipMenu.GetMenuId())
250 return;
251
252 GossipMenuItem const* item = gossipMenu.GetItem(gossipListId);
253 if (!item)
254 return;
255
256 uint32 gossipOptionId = item->OptionType;
257 ObjectGuid guid = source->GetGUID();
258
259 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->IsCreature())
260 {
262 {
264
267 else
269
271 return;
272 }
273 }
274
275 if (source->IsGameObject())
276 {
277 if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER)
278 {
279 LOG_ERROR("entities.player", "Player guid {} request invalid gossip option for GameObject entry {}", GetGUID().ToString(), source->GetEntry());
280 return;
281 }
282 }
283
284 GossipMenuItemData const* menuItemData = gossipMenu.GetItemData(gossipListId);
285 if (!menuItemData)
286 return;
287
288 int32 cost = int32(item->BoxMoney);
289 if (!HasEnoughMoney(cost))
290 {
293 return;
294 }
295
296 switch (gossipOptionId)
297 {
300 {
301 if (menuItemData->GossipActionPoi)
303
304 if (menuItemData->GossipActionMenuId)
305 {
306 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
307 SendPreparedGossip(source);
308 }
309
310 break;
311 }
313 sOutdoorPvPMgr->HandleGossipOption(this, source->ToCreature(), gossipListId);
314 break;
316 if (isDead())
317 source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, nullptr, nullptr, GetGUID());
318 break;
320 PrepareQuestMenu(guid);
321 SendPreparedQuest(guid);
322 break;
325 GetSession()->SendListInventory(guid, menuItemData->GossipActionMenuId);
326 break;
328 GetSession()->SendStablePet(guid);
329 break;
332 break;
334 if (GetSpecsCount() == 1 && GetLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))
335 {
336 // Cast spells that teach dual spec
337 // Both are also ImplicitTarget self and must be cast by player
338 CastSpell(this, 63680, true, nullptr, nullptr, GetGUID());
339 CastSpell(this, 63624, true, nullptr, nullptr, GetGUID());
340
341 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
342 SendPreparedGossip(source);
343 }
344 break;
348 break;
352 break;
354 GetSession()->SendTaxiMenu(source->ToCreature());
355 break;
358 SetBindPoint(guid);
359 break;
361 GetSession()->SendShowBank(guid);
362 break;
366 break;
370 break;
372 GetSession()->SendAuctionHello(guid, source->ToCreature());
373 break;
375 PrepareGossipMenu(source);
376 SendPreparedGossip(source);
377 break;
379 {
380 BattlegroundTypeId bgTypeId = sBattlegroundMgr->GetBattleMasterBG(source->GetEntry());
381
382 if (bgTypeId == BATTLEGROUND_TYPE_NONE)
383 {
384 LOG_ERROR("entities.player", "A user ({}) requested battlegroundlist from a npc who is no battlemaster", GetGUID().ToString());
385 return;
386 }
387
388 GetSession()->SendBattleGroundList(guid, bgTypeId);
389 break;
390 }
391 }
392
393 ModifyMoney(-cost);
394}
@ LANG_INSTANT_FLIGHT_OFF
Definition: Language.h:1319
@ LANG_INSTANT_FLIGHT_ON
Definition: Language.h:1318
@ UNIT_NPC_FLAG_FLIGHTMASTER
Definition: UnitDefines.h:328
@ GOSSIP_OPTION_AUCTIONEER
Definition: GossipDef.h:48
@ GOSSIP_OPTION_UNLEARNTALENTS
Definition: GossipDef.h:51
@ GOSSIP_OPTION_TRAINER
Definition: GossipDef.h:40
@ GOSSIP_OPTION_ARMORER
Definition: GossipDef.h:50
@ GOSSIP_OPTION_UNLEARNPETTALENTS
Definition: GossipDef.h:52
@ GOSSIP_OPTION_VENDOR
Definition: GossipDef.h:38
@ GOSSIP_OPTION_OUTDOORPVP
Definition: GossipDef.h:54
@ GOSSIP_OPTION_BATTLEFIELD
Definition: GossipDef.h:47
@ GOSSIP_OPTION_TABARDDESIGNER
Definition: GossipDef.h:46
@ GOSSIP_OPTION_TAXIVENDOR
Definition: GossipDef.h:39
@ GOSSIP_OPTION_QUESTGIVER
Definition: GossipDef.h:37
@ GOSSIP_OPTION_LEARNDUALSPEC
Definition: GossipDef.h:53
@ GOSSIP_OPTION_INNKEEPER
Definition: GossipDef.h:43
@ GOSSIP_OPTION_SPIRITGUIDE
Definition: GossipDef.h:42
@ GOSSIP_OPTION_DUALSPEC_INFO
Definition: GossipDef.h:55
@ GOSSIP_OPTION_PETITIONER
Definition: GossipDef.h:45
@ GOSSIP_OPTION_BANKER
Definition: GossipDef.h:44
@ GOSSIP_OPTION_GOSSIP
Definition: GossipDef.h:36
@ GOSSIP_OPTION_SPIRITHEALER
Definition: GossipDef.h:41
@ GOSSIP_OPTION_STABLEPET
Definition: GossipDef.h:49
@ GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT
Definition: Player.h:1024
@ CONFIG_MIN_DUALSPEC_LEVEL
Definition: IWorld.h:237
BattlegroundTypeId
Definition: SharedDefines.h:3495
@ BATTLEGROUND_TYPE_NONE
Definition: SharedDefines.h:3496
void SendNotification(std::string_view str)
Definition: Chat.cpp:105
Definition: GossipDef.h:132
uint32 OptionType
Definition: GossipDef.h:137
uint32 BoxMoney
Definition: GossipDef.h:139
Definition: GossipDef.h:146
uint32 GossipActionMenuId
Definition: GossipDef.h:147
uint32 GossipActionPoi
Definition: GossipDef.h:148
Definition: GossipDef.h:163
GossipMenuItem const * GetItem(uint32 id) const
Definition: GossipDef.h:188
uint32 GetMenuId() const
Definition: GossipDef.h:172
GossipMenuItemData const * GetItemData(uint32 indexId) const
Definition: GossipDef.h:197
void SendCloseGossip()
Definition: GossipDef.cpp:239
void SendPointOfInterest(uint32 poiId) const
Definition: GossipDef.cpp:247
GossipMenu & GetGossipMenu()
Definition: GossipDef.h:264
bool IsGameObject() const
Definition: Object.h:213
Unit * ToUnit()
Definition: Object.h:210
void SendTalentWipeConfirm(ObjectGuid guid)
Definition: Player.cpp:8891
void SendPreparedGossip(WorldObject *source)
Definition: PlayerGossip.cpp:209
void SendPreparedQuest(ObjectGuid guid)
Definition: PlayerQuest.cpp:115
void ToggleInstantFlight()
Definition: PlayerGossip.cpp:437
void ResetPetTalents()
Definition: Player.cpp:8900
void PrepareQuestMenu(ObjectGuid guid)
Definition: PlayerQuest.cpp:39
void SetBindPoint(ObjectGuid guid)
Definition: Player.cpp:8884
void PrepareGossipMenu(WorldObject *source, uint32 menuId=0, bool showQuests=false)
Definition: PlayerGossip.cpp:32
NPCFlags GetNpcFlags() const
Clears emote state (looping emote)
Definition: Unit.h:717
void SendAuctionHello(ObjectGuid guid, Creature *unit)
Definition: AuctionHouseHandler.cpp:53
void SendPetitionShowList(ObjectGuid guid)
Definition: PetitionsHandler.cpp:824
void SendTaxiMenu(Creature *unit)
Definition: TaxiHandler.cpp:84
void SendListInventory(ObjectGuid guid, uint32 vendorEntry=0)
Definition: ItemHandler.cpp:1035
void SendTrainerList(ObjectGuid guid)
Definition: NPCHandler.cpp:87
void SendShowBank(ObjectGuid guid)
Definition: BankHandler.cpp:188
void SendStablePet(ObjectGuid guid)
Definition: NPCHandler.cpp:480
void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId=BATTLEGROUND_RB)
Definition: BattleGroundHandler.cpp:67
void SendTabardVendorActivate(ObjectGuid guid)
Definition: NPCHandler.cpp:65

References BATTLEGROUND_TYPE_NONE, GossipMenuItem::BoxMoney, BUY_ERR_NOT_ENOUGHT_MONEY, Unit::CastSpell(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, Object::GetEntry(), PlayerMenu::GetGossipMenu(), Object::GetGUID(), GossipMenu::GetItem(), GossipMenu::GetItemData(), Unit::GetLevel(), GossipMenu::GetMenuId(), Unit::GetNpcFlags(), GetSession(), GetSpecsCount(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, GossipMenuItemData::GossipActionMenuId, GossipMenuItemData::GossipActionPoi, HasEnoughMoney(), Object::IsCreature(), Unit::isDead(), Object::IsGameObject(), LANG_INSTANT_FLIGHT_OFF, LANG_INSTANT_FLIGHT_ON, LOG_ERROR, m_isInstantFlightOn, ModifyMoney(), GossipMenuItem::OptionType, PlayerTalkClass, PrepareGossipMenu(), PrepareQuestMenu(), ResetPetTalents(), sBattlegroundMgr, WorldSession::SendAuctionHello(), WorldSession::SendBattleGroundList(), SendBuyError(), PlayerMenu::SendCloseGossip(), WorldSession::SendListInventory(), ChatHandler::SendNotification(), WorldSession::SendPetitionShowList(), PlayerMenu::SendPointOfInterest(), SendPreparedGossip(), SendPreparedQuest(), WorldSession::SendShowBank(), WorldSession::SendStablePet(), WorldSession::SendTabardVendorActivate(), SendTalentWipeConfirm(), WorldSession::SendTaxiMenu(), WorldSession::SendTrainerList(), SetBindPoint(), sOutdoorPvPMgr, sWorld, Object::ToCreature(), ToggleInstantFlight(), Position::ToString(), Object::ToUnit(), and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ outDebugValues()

void Player::outDebugValues ( ) const
protected
7783{
7784 if (!sLog->ShouldLog("entities.player", LogLevel::LOG_LEVEL_DEBUG)) // optimize disabled debug output
7785 return;
7786
7787 LOG_DEBUG("entities.player", "HP is: \t\t\t{}\t\tMP is: \t\t\t{}", GetMaxHealth(), GetMaxPower(POWER_MANA));
7788 LOG_DEBUG("entities.player", "AGILITY is: \t\t{}\t\tSTRENGTH is: \t\t{}", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH));
7789 LOG_DEBUG("entities.player", "INTELLECT is: \t\t{}\t\tSPIRIT is: \t\t{}", GetStat(STAT_INTELLECT), GetStat(STAT_SPIRIT));
7790 LOG_DEBUG("entities.player", "STAMINA is: \t\t{}", GetStat(STAT_STAMINA));
7791 LOG_DEBUG("entities.player", "Armor is: \t\t{}\t\tBlock is: \t\t{}", GetArmor(), GetFloatValue(PLAYER_BLOCK_PERCENTAGE));
7792 LOG_DEBUG("entities.player", "HolyRes is: \t\t{}\t\tFireRes is: \t\t{}", GetResistance(SPELL_SCHOOL_HOLY), GetResistance(SPELL_SCHOOL_FIRE));
7793 LOG_DEBUG("entities.player", "NatureRes is: \t\t{}\t\tFrostRes is: \t\t{}", GetResistance(SPELL_SCHOOL_NATURE), GetResistance(SPELL_SCHOOL_FROST));
7794 LOG_DEBUG("entities.player", "ShadowRes is: \t\t{}\t\tArcaneRes is: \t\t{}", GetResistance(SPELL_SCHOOL_SHADOW), GetResistance(SPELL_SCHOOL_ARCANE));
7795 LOG_DEBUG("entities.player", "MIN_DAMAGE is: \t\t{}\tMAX_DAMAGE is: \t\t{}", GetFloatValue(UNIT_FIELD_MINDAMAGE), GetFloatValue(UNIT_FIELD_MAXDAMAGE));
7796 LOG_DEBUG("entities.player", "MIN_OFFHAND_DAMAGE is: \t{}\tMAX_OFFHAND_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE), GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE));
7797 LOG_DEBUG("entities.player", "MIN_RANGED_DAMAGE is: \t{}\tMAX_RANGED_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE), GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE));
7798 LOG_DEBUG("entities.player", "ATTACK_TIME is: \t{}\t\tRANGE_ATTACK_TIME is: \t{}", GetAttackTime(BASE_ATTACK), GetAttackTime(RANGED_ATTACK));
7799}
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:285
#define sLog
Definition: Log.h:126
uint32 GetArmor() const
Definition: Unit.h:1079

References BASE_ATTACK, Unit::GetArmor(), Unit::GetAttackTime(), Object::GetFloatValue(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), LOG_DEBUG, PLAYER_BLOCK_PERCENTAGE, POWER_MANA, RANGED_ATTACK, sLog, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_SHADOW, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by LoadFromDB(), and SaveToDB().

◆ PetSpellInitialize()

void Player::PetSpellInitialize ( )
9481{
9482 Pet* pet = GetPet();
9483
9484 if (!pet)
9485 return;
9486
9487 LOG_DEBUG("entities.pet", "Pet Spells Groups");
9488
9489 CharmInfo* charmInfo = pet->GetCharmInfo();
9490
9491 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9492 data << pet->GetGUID();
9493 data << uint16(pet->GetCreatureTemplate()->family); // creature family (required for pet talents)
9494 data << uint32(pet->GetDuration().count());
9495 data << uint8(pet->GetReactState());
9496 data << uint8(charmInfo->GetCommandState());
9497 data << uint16(0); // Flags, mostly unknown
9498
9499 // action bar loop
9500 charmInfo->BuildActionBar(&data);
9501
9502 std::size_t spellsCountPos = data.wpos();
9503
9504 // spells count
9505 uint8 addlist = 0;
9506 data << uint8(addlist); // placeholder
9507
9508 if (pet->IsPermanentPetFor(this))
9509 {
9510 // spells loop
9511 for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
9512 {
9513 if (itr->second.state == PETSPELL_REMOVED)
9514 continue;
9515
9516 data << uint32(MAKE_UNIT_ACTION_BUTTON(itr->first, itr->second.active));
9517 ++addlist;
9518 }
9519 }
9520
9521 data.put<uint8>(spellsCountPos, addlist);
9522
9523 uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size();
9524 data << uint8(cooldownsCount);
9525
9526 uint32 curTime = GameTime::GetGameTimeMS().count();
9528
9529 for (CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
9530 {
9531 uint16 category = itr->second.category;
9532 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9533
9534 data << uint32(itr->first); // spellid
9535 data << uint16(itr->second.category); // spell category
9536
9537 // send infinity cooldown in special format
9538 if (itr->second.end >= infTime)
9539 {
9540 data << uint32(1); // cooldown
9541 data << uint32(0x80000000); // category cooldown
9542 continue;
9543 }
9544
9545 data << uint32(category ? 0 : cooldown); // cooldown
9546 data << uint32(category ? cooldown : 0); // category cooldown
9547 }
9548
9549 GetSession()->SendPacket(&data);
9550}
@ PETSPELL_REMOVED
Definition: PetDefines.h:60
#define MAKE_UNIT_ACTION_BUTTON(A, T)
Definition: CharmInfo.h:33
CreatureSpellCooldowns m_CreatureSpellCooldowns
Definition: Creature.h:255
bool IsPermanentPetFor(Player *owner) const
Definition: Pet.cpp:2295
Milliseconds GetDuration() const
Definition: Pet.h:91
PetSpellMap m_spells
Definition: Pet.h:121

References CharmInfo::BuildActionBar(), CreatureTemplate::family, Unit::GetCharmInfo(), CharmInfo::GetCommandState(), Creature::GetCreatureTemplate(), Pet::GetDuration(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetPet(), Creature::GetReactState(), GetSession(), infinityCooldownDelayCheck, Pet::IsPermanentPetFor(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Pet::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_UNIT_ACTION_BAR_INDEX, PETSPELL_REMOVED, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_PET_SPELLS, and ByteBuffer::wpos().

Referenced by CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectLearnPetSpell(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), AuraEffect::HandleModPossessPet(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandleRequestPetInfo(), Pet::learnSpell(), Pet::LoadPetFromDB(), Pet::resetTalents(), Unit::SetMinion(), and SummonPet().

◆ PossessSpellInitialize()

void Player::PossessSpellInitialize ( )
9553{
9554 Unit* charm = GetCharm();
9555 if (!charm)
9556 return;
9557
9558 CharmInfo* charmInfo = charm->GetCharmInfo();
9559
9560 if (!charmInfo)
9561 {
9562 LOG_ERROR("entities.player", "Player::PossessSpellInitialize(): charm ({}) has no charminfo!", charm->GetGUID().ToString());
9563 return;
9564 }
9565
9566 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9567 data << charm->GetGUID();
9568 data << uint16(0);
9569 data << uint32(0);
9570 data << uint32(0);
9571
9572 charmInfo->BuildActionBar(&data);
9573
9574 data << uint8(0); // spells count
9575 data << uint8(0); // cooldowns count
9576
9577 GetSession()->SendPacket(&data);
9578}
Unit * GetCharm() const
Definition: Unit.cpp:10715

References CharmInfo::BuildActionBar(), Unit::GetCharm(), Unit::GetCharmInfo(), Object::GetGUID(), GetSession(), LOG_ERROR, MAX_UNIT_ACTION_BAR_INDEX, WorldSession::SendPacket(), SMSG_PET_SPELLS, and ObjectGuid::ToString().

Referenced by Unit::SetCharmedBy().

◆ PrepareCharmAISpells()

void Player::PrepareCharmAISpells ( )
15355{
15356 for (int i = 0; i < NUM_CAI_SPELLS; ++i)
15357 m_charmAISpells[i] = 0;
15358
15359 uint32 damage_type[4] = {0, 0, 0, 0};
15360 uint32 periodic_damage = 0;
15361
15362 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15363 {
15364 if (itr->second->State == PLAYERSPELL_REMOVED || !itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
15365 continue;
15366
15367 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
15368 if (!spellInfo)
15369 continue;
15370
15371 if (!spellInfo->SpellFamilyName || spellInfo->IsPassive() || spellInfo->NeedsComboPoints() || (spellInfo->Stances && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)))
15372 continue;
15373
15374 float cast = spellInfo->CalcCastTime() / 1000.0f;
15375 if (cast > 3.0f)
15376 continue;
15377
15378 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
15379 {
15380 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
15381 {
15382 int32 dmg = CalculateSpellDamage(this, spellInfo, i);
15383 uint8 offset = 0;
15384 if (cast)
15385 {
15386 dmg = dmg / cast;
15387 offset = 2;
15388 }
15389
15390 if ((int32)damage_type[offset] < dmg)
15391 {
15392 if (!m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] || !spellInfo->IsHighRankOf(sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])) || urand(0, 1))
15393 if (damage_type[1 + offset] < damage_type[offset])
15394 {
15396 damage_type[1 + offset] = damage_type[offset];
15397 }
15398
15399 m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] = spellInfo->Id;
15400 damage_type[offset] = dmg;
15401 }
15402 else if ((int32)damage_type[1 + offset] < dmg)
15403 {
15404 if (m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] && sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])->IsHighRankOf(spellInfo) && urand(0, 1))
15405 continue;
15406
15407 m_charmAISpells[SPELL_INSTANT_DAMAGE2 + offset] = spellInfo->Id;
15408 damage_type[1 + offset] = dmg;
15409 }
15410 break;
15411 }
15413 {
15414 m_charmAISpells[SPELL_T_CHARGE] = spellInfo->Id;
15415 break;
15416 }
15417 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_SPEED)
15418 {
15419 m_charmAISpells[SPELL_FAST_RUN] = spellInfo->Id;
15420 break;
15421 }
15422 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_SCHOOL_IMMUNITY)
15423 {
15424 m_charmAISpells[SPELL_IMMUNITY] = spellInfo->Id;
15425 break;
15426 }
15427 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)
15428 {
15429 if ((int32)periodic_damage < CalculateSpellDamage(this, spellInfo, i))
15430 {
15431 m_charmAISpells[SPELL_DOT_DAMAGE] = spellInfo->Id;
15432 break;
15433 }
15434 }
15435 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN)
15436 {
15437 m_charmAISpells[SPELL_T_STUN] = spellInfo->Id;
15438 break;
15439 }
15440 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT || spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_FEAR)
15441 {
15443 break;
15444 }
15445 }
15446 }
15447}
@ SPELL_ROOT_OR_FEAR
Definition: Player.h:922
@ SPELL_INSTANT_DAMAGE2
Definition: Player.h:924
@ SPELL_INSTANT_DAMAGE
Definition: Player.h:923
@ SPELL_T_CHARGE
Definition: Player.h:928
@ SPELL_DOT_DAMAGE
Definition: Player.h:927
@ SPELL_FAST_RUN
Definition: Player.h:930
@ SPELL_T_STUN
Definition: Player.h:921
@ SPELL_IMMUNITY
Definition: Player.h:929
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition: SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FEAR
Definition: SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition: SpellAuraDefines.h:89
@ SPELL_AURA_MOD_STUN
Definition: SpellAuraDefines.h:75
@ SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT
Definition: SharedDefines.h:659
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:780
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14902
bool IsHighRankOf(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:2585
bool NeedsComboPoints() const
Definition: SpellInfo.cpp:1266
uint32 CalcCastTime(Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2352

References SpellInfo::CalcCastTime(), Unit::CalculateSpellDamage(), SpellInfo::Effects, GetActiveSpec(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsHighRankOf(), SpellInfo::IsPassive(), m_charmAISpells, m_spells, MAX_SPELL_EFFECTS, SpellInfo::NeedsComboPoints(), NUM_CAI_SPELLS, PLAYERSPELL_REMOVED, SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_SCHOOL_IMMUNITY, SPELL_DOT_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_FAST_RUN, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_INSTANT_DAMAGE2, SPELL_ROOT_OR_FEAR, SPELL_T_CHARGE, SPELL_T_STUN, SpellInfo::SpellFamilyName, sSpellMgr, SpellInfo::Stances, and urand().

Referenced by LoadFromDB().

◆ PrepareGossipMenu()

void Player::PrepareGossipMenu ( WorldObject source,
uint32  menuId = 0,
bool  showQuests = false 
)

Find localizations from database.

Find localizations from database.

33{
35 menu->ClearMenus();
36
37 menu->GetGossipMenu().SetMenuId(menuId);
38
39 GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
40
41 // if default menuId and no menu options exist for this, use options from default options
42 if (menuItemBounds.first == menuItemBounds.second && menuId == GetDefaultGossipMenuForSource(source))
43 menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(0);
44
45 uint32 npcflags = 0;
46
47 if (source->IsCreature())
48 {
49 npcflags = source->ToUnit()->GetNpcFlags();
50 if (showQuests && npcflags & UNIT_NPC_FLAG_QUESTGIVER)
51 PrepareQuestMenu(source->GetGUID());
52 }
53 else if (source->IsGameObject())
54 if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER)
55 PrepareQuestMenu(source->GetGUID());
56
57 for (GossipMenuItemsContainer::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
58 {
59 bool canTalk = true;
60 if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
61 continue;
62
63 if (Creature* creature = source->ToCreature())
64 {
65 if (!(itr->second.OptionNpcFlag & npcflags))
66 continue;
67
68 switch (itr->second.OptionType)
69 {
71 canTalk = false; // added in special mode
72 break;
74 if (!isDead())
75 canTalk = false;
76 break;
78 {
79 if (!creature->isVendorWithIconSpeak())
80 {
81 VendorItemData const* vendorItems = itr->second.ActionMenuID ? sObjectMgr->GetNpcVendorItemList(itr->second.ActionMenuID) : creature->GetVendorItems();
82 if (!vendorItems || vendorItems->Empty())
83 {
84 LOG_ERROR("sql.sql", "Creature {} have UNIT_NPC_FLAG_VENDOR but have empty trading item list.", creature->GetGUID().ToString());
85 canTalk = false;
86 }
87 break;
88 }
89 break;
90 }
93 if (!(GetSpecsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(this) && !(GetLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))))
94 canTalk = false;
95 break;
97 if (!creature->isCanTrainingAndResetTalentsOf(this))
98 canTalk = false;
99 break;
101 if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureTemplate()->trainer_class != CLASS_HUNTER)
102 canTalk = false;
103 break;
105 if (GetSession()->SendLearnNewTaxiNode(creature))
106 return;
107 break;
109 if (!creature->isCanInteractWithBattleMaster(this, false))
110 canTalk = false;
111 break;
114 canTalk = false;
115 break;
117 canTalk = false;
118 break;
120 if (!creature->IsValidTrainerForPlayer(this))
121 {
122 canTalk = false;
123 }
124 break;
126 if (creature->isVendorWithIconSpeak())
127 {
128 VendorItemData const* vendorItems = creature->GetVendorItems();
129 if (!vendorItems || vendorItems->Empty())
130 {
131 canTalk = false;
132 }
133 }
134 break;
141 break; // no checks
143 if (!sOutdoorPvPMgr->CanTalkTo(this, creature, itr->second))
144 canTalk = false;
145 break;
146 default:
147 LOG_ERROR("sql.sql", "Creature entry {} has unknown OptionType {} for menu {}", creature->GetEntry(), itr->second.OptionType, itr->second.MenuID);
148 canTalk = false;
149 break;
150 }
151 }
152 else if (GameObject* go = source->ToGameObject())
153 {
154 switch (itr->second.OptionType)
155 {
157 if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER && go->GetGoType() != GAMEOBJECT_TYPE_GOOBER)
158 canTalk = false;
159 break;
160 default:
161 canTalk = false;
162 break;
163 }
164 }
165
166 if (canTalk)
167 {
168 // using gossip_menu_option texts by default
169 std::string strOptionText = itr->second.OptionText;
170 std::string strBoxText = itr->second.BoxText;
171 // search in broadcast_text and broadcast_text_locale
172 BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID);
173 BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID);
175
176 if (optionBroadcastText)
177 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? optionBroadcastText->MaleText : optionBroadcastText->FemaleText, locale, strOptionText);
178
179 if (boxBroadcastText)
180 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? boxBroadcastText->MaleText : boxBroadcastText->FemaleText, locale, strBoxText);
181
182 // if the language is not default and the texts weren't found, maybe they're in gossip_menu_option_locale table
183 if (locale != DEFAULT_LOCALE)
184 {
185 if (!optionBroadcastText)
186 {
188 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
189 ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText);
190 }
191
192 if (!boxBroadcastText)
193 {
195 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
196 ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText);
197 }
198 }
199
200 menu->GetGossipMenu().AddMenuItem(itr->second.OptionID, itr->second.OptionIcon, strOptionText, 0, itr->second.OptionType, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
201 menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID);
202 }
203 }
204
205 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && npcflags & UNIT_NPC_FLAG_FLIGHTMASTER)
207}
@ LANG_TOGGLE_INSTANT_FLIGHT
Definition: Language.h:1317
@ HUNTER_PET
Definition: PetDefines.h:32
@ GOSSIP_ICON_INTERACT_1
Definition: GossipDef.h:65
std::pair< GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator > GossipMenuItemsMapBounds
Definition: ObjectMgr.h:634
@ GAMEOBJECT_TYPE_GOOBER
Definition: SharedDefines.h:1570
@ TRAINER_TYPE_PETS
Definition: SharedDefines.h:2620
LocaleConstant
Definition: Common.h:65
#define DEFAULT_LOCALE
Definition: Common.h:79
AC_GAME_API std::string GetAcoreString(ChatHandler const *handler, AcoreStrings which)
Definition: ChatCommandHelpers.cpp:27
Definition: CreatureData.h:349
void SetMenuId(uint32 menu_id)
Definition: GossipDef.h:171
void AddMenuItem(int32 menuItemId, uint8 icon, std::string const &message, uint32 sender, uint32 action, std::string const &boxMessage, uint32 boxMoney, bool coded=false)
Definition: GossipDef.cpp:41
void AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
Definition: GossipDef.cpp:136
void ClearMenus()
Definition: GossipDef.cpp:187
GameobjectTypes GetGoType() const
Definition: GameObject.h:202
Definition: ObjectMgr.h:434
std::vector< std::string > FemaleText
Definition: ObjectMgr.h:444
std::vector< std::string > MaleText
Definition: ObjectMgr.h:443
static std::string_view GetLocaleString(std::vector< std::string > const &data, std::size_t locale)
Definition: ObjectMgr.h:1419

References GossipMenu::AddGossipMenuItemData(), GossipMenu::AddMenuItem(), CLASS_CONTEXT_PET, CLASS_HUNTER, PlayerMenu::ClearMenus(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, DEFAULT_LOCALE, VendorItemData::Empty(), BroadcastText::FemaleText, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_QUESTGIVER, GENDER_MALE, GetDefaultGossipMenuForSource(), Unit::getGender(), PlayerMenu::GetGossipMenu(), GameObject::GetGoType(), Object::GetGUID(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Unit::GetNpcFlags(), GetPet(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetSpecsCount(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_ICON_INTERACT_1, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, HUNTER_PET, IsClass(), Object::IsCreature(), Unit::isDead(), Object::IsGameObject(), LANG_TOGGLE_INSTANT_FLIGHT, LOG_ERROR, m_spells, MAKE_PAIR32(), BroadcastText::MaleText, PlayerTalkClass, PrepareQuestMenu(), sConditionMgr, GossipMenu::SetMenuId(), sObjectMgr, sOutdoorPvPMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), Object::ToUnit(), TRAINER_TYPE_PETS, UNIT_NPC_FLAG_FLIGHTMASTER, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), brann_bronzebeard::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ PrepareQuestMenu()

void Player::PrepareQuestMenu ( ObjectGuid  guid)
40{
41 QuestRelationBounds objectQR;
42 QuestRelationBounds objectQIR;
43
44 // pets also can have quests
46 if (creature)
47 {
48 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
49 objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
50 }
51 else
52 {
53 //we should obtain map pointer from GetMap() in 99% of cases. Special case
54 //only for quests which cast teleport spells on player
56 ASSERT(_map);
57 GameObject* pGameObject = _map->GetGameObject(guid);
58 if (pGameObject)
59 {
60 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
61 objectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry());
62 }
63 else
64 return;
65 }
66
68 qm.ClearMenu();
69
70 for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i)
71 {
72 uint32 quest_id = i->second;
73 QuestStatus status = GetQuestStatus(quest_id);
74 if (status == QUEST_STATUS_COMPLETE)
75 qm.AddMenuItem(quest_id, 4);
76 else if (status == QUEST_STATUS_INCOMPLETE)
77 qm.AddMenuItem(quest_id, 4);
78 //else if (status == QUEST_STATUS_AVAILABLE)
79 // qm.AddMenuItem(quest_id, 2);
80 }
81
82 for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i)
83 {
84 uint32 quest_id = i->second;
85 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
86 if (!quest)
87 continue;
88
89 if (!CanTakeQuest(quest, false))
90 continue;
91
92 if (quest->IsAutoComplete() && (!quest->IsRepeatable() || quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly()))
93 qm.AddMenuItem(quest_id, 0);
94 else if (quest->IsAutoComplete())
95 qm.AddMenuItem(quest_id, 4);
96 else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE)
97 qm.AddMenuItem(quest_id, 2);
98 }
99}
Definition: GossipDef.h:229
void ClearMenu()
Definition: GossipDef.cpp:310
void AddMenuItem(uint32 QuestId, uint8 Icon)
Definition: GossipDef.cpp:286
QuestMenu & GetQuestMenu()
Definition: GossipDef.h:265

References QuestMenu::AddMenuItem(), ASSERT, CanTakeQuest(), QuestMenu::ClearMenu(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), PlayerMenu::GetQuestMenu(), GetQuestStatus(), Quest::IsAutoComplete(), Quest::IsDaily(), Object::IsInWorld(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), PlayerTalkClass, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, sMapMgr, and sObjectMgr.

Referenced by npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), npc_sayge::OnGossipHello(), go_fel_crystalforge::OnGossipHello(), go_bashir_crystalforge::OnGossipHello(), OnGossipSelect(), PrepareGossipMenu(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ PrettyPrintRequirementsAchievementsList()

void Player::PrettyPrintRequirementsAchievementsList ( const std::vector< const ProgressionRequirement * > &  missingAchievements) const
6636{
6638 for (const ProgressionRequirement* missingReq : missingAchievements)
6639 {
6640 AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(missingReq->id);
6641 if (!achievementEntry)
6642 {
6643 continue;
6644 }
6645
6646 std::string name = achievementEntry->name[sObjectMgr->GetDBCLocaleIndex()];
6647
6648 std::stringstream stream;
6649 stream << "|cffff7c0a|Hachievement:";
6650 stream << missingReq->id;
6651 stream << ":";
6652 stream << GetGUID().ToString();
6653 stream << ":0:0:0:0:0:0:0:0|h[";
6654 stream << name;
6655 stream << "]|h|r";
6656
6657 if (missingReq->note.empty())
6658 {
6659 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6660 }
6661 else
6662 {
6663 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6664 }
6665 }
6666}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
@ LANG_ACCESS_REQUIREMENT_NOTE
Definition: Language.h:846
Definition: Player.h:939
Definition: DBCStructure.h:40
std::array< char const *, 16 > name
Definition: DBCStructure.h:45

References Object::GetGUID(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), LANG_ACCESS_REQUIREMENT_NOTE, AchievementEntry::name, ChatHandler::PSendSysMessage(), sAchievementStore, sObjectMgr, and ObjectGuid::ToString().

Referenced by Satisfy().

◆ PrettyPrintRequirementsItemsList()

void Player::PrettyPrintRequirementsItemsList ( const std::vector< const ProgressionRequirement * > &  missingItems) const
6669{
6671 for (const ProgressionRequirement* missingReq : missingItems)
6672 {
6673 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(missingReq->id);
6674 if (!itemTemplate)
6675 {
6676 continue;
6677 }
6678
6679 //Get the localised name
6680 std::string name = itemTemplate->Name1;
6681 if (ItemLocale const* il = sObjectMgr->GetItemLocale(itemTemplate->ItemId))
6682 {
6683 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6684 }
6685
6686 std::stringstream stream;
6687 stream << "|c";
6688 stream << std::hex << ItemQualityColors[itemTemplate->Quality] << std::dec;
6689 stream << "|Hitem:";
6690 stream << itemTemplate->ItemId;
6691 stream << ":0:0:0:0:0:0:0:0:0|h[";
6692 stream << name;
6693 stream << "]|h|r";
6694
6695 if (missingReq->note.empty())
6696 {
6697 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6698 }
6699 else
6700 {
6701 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6702 }
6703 }
6704}
const uint32 ItemQualityColors[MAX_ITEM_QUALITY]
Definition: SharedDefines.h:353
std::string Name1
Definition: ItemTemplate.h:624
Definition: ItemTemplate.h:838

References ObjectMgr::GetLocaleString(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), ItemTemplate::ItemId, ItemQualityColors, LANG_ACCESS_REQUIREMENT_NOTE, ItemTemplate::Name1, ChatHandler::PSendSysMessage(), ItemTemplate::Quality, and sObjectMgr.

Referenced by Satisfy().

◆ PrettyPrintRequirementsQuestList()

void Player::PrettyPrintRequirementsQuestList ( const std::vector< const ProgressionRequirement * > &  missingQuests) const
6599{
6601 for (const ProgressionRequirement* missingReq : missingQuests)
6602 {
6603 Quest const* questTemplate = sObjectMgr->GetQuestTemplate(missingReq->id);
6604 if (!questTemplate)
6605 {
6606 continue;
6607 }
6608
6609 std::string questTitle = questTemplate->GetTitle();
6610 if (QuestLocale const* questLocale = sObjectMgr->GetQuestLocale(questTemplate->GetQuestId()))
6611 {
6612 ObjectMgr::GetLocaleString(questLocale->Title, loc_idx, questTitle);
6613 }
6614
6615 std::stringstream stream;
6616 stream << "|cffff7c0a|Hquest:";
6617 stream << questTemplate->GetQuestId();
6618 stream << ":";
6619 stream << questTemplate->GetQuestLevel();
6620 stream << "|h[";
6621 stream << questTitle;
6622 stream << "]|h|r";
6623
6624 if (missingReq->note.empty())
6625 {
6626 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6627 }
6628 else
6629 {
6630 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6631 }
6632 }
6633}
Definition: QuestDef.h:183
int32 GetQuestLevel() const
Definition: QuestDef.h:233
std::string const & GetTitle() const
Definition: QuestDef.h:261

References ObjectMgr::GetLocaleString(), Quest::GetQuestId(), Quest::GetQuestLevel(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LANG_ACCESS_REQUIREMENT_NOTE, ChatHandler::PSendSysMessage(), and sObjectMgr.

Referenced by Satisfy().

◆ ProcessDelayedOperations()

void Player::ProcessDelayedOperations ( )
1624{
1625 if (m_DelayedOperations == 0)
1626 return;
1627
1629 {
1630 ResurrectPlayer(0.0f, false);
1631
1634 else
1635 SetFullHealth();
1636
1639 else
1641
1642 SetPower(POWER_RAGE, 0);
1644
1646 }
1647
1649 SaveToDB(false, false);
1650
1652 {
1653 Aura* aura = GetAura(26013);
1654 if (!aura || aura->GetDuration() <= 900000)
1655 CastSpell(this, 26013, true);
1656 }
1657
1659 {
1661 {
1662 // xinef: remove shapeshift auras
1664 {
1666 }
1669 }
1670 }
1671
1673 {
1675 {
1680 }
1681 }
1682
1684 {
1685 if (Group* g = GetGroup())
1686 g->SendUpdateToPlayer(GetGUID());
1687 }
1688
1690 {
1691 if (Vehicle* vehicle = GetVehicle())
1692 {
1693 SeatMap::iterator itr = vehicle->GetSeatIteratorForPassenger(this);
1694 if (itr != vehicle->Seats.end())
1695 if (Unit* base = vehicle->GetBase())
1696 {
1697 ExitVehicle();
1698 base->HandleSpellClick(this, itr->first);
1699 }
1700 }
1701 }
1702
1703 //we have executed ALL delayed ops, so clear the flag
1705}
@ DELAYED_BG_GROUP_RESTORE
Flag to restore group state after teleport from BG.
Definition: Player.h:914
@ DELAYED_SAVE_PLAYER
Definition: Player.h:909
@ DELAYED_BG_MOUNT_RESTORE
Flag to restore mount state after teleport from BG.
Definition: Player.h:912
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:915
@ DELAYED_BG_TAXI_RESTORE
Flag to restore taxi state after teleport from BG.
Definition: Player.h:913
@ DELAYED_SPELL_CAST_DESERTER
Definition: Player.h:911
@ DELAYED_RESURRECT_PLAYER
Definition: Player.h:910
void SaveToDB(bool create, bool logout)
Definition: PlayerStorage.cpp:7050
uint32 m_resurrectMana
Definition: Player.h:2854
void ContinueTaxiFlight()
Definition: Player.cpp:10392
uint32 m_resurrectHealth
Definition: Player.h:2854
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:18896
Definition: Vehicle.h:28

References Unit::AddAura(), PlayerTaxi::AddTaxiDestination(), Unit::CastSpell(), EntryPointData::ClearTaxiPath(), ContinueTaxiFlight(), DELAYED_BG_GROUP_RESTORE, DELAYED_BG_MOUNT_RESTORE, DELAYED_BG_TAXI_RESTORE, DELAYED_RESURRECT_PLAYER, DELAYED_SAVE_PLAYER, DELAYED_SPELL_CAST_DESERTER, DELAYED_VEHICLE_TELEPORT, Unit::ExitVehicle(), Unit::GetAura(), Aura::GetDuration(), GetGroup(), Object::GetGUID(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetVehicle(), EntryPointData::HasTaxiPath(), Unit::IsInDisallowedMountForm(), m_DelayedOperations, m_entryPointData, m_resurrectHealth, m_resurrectMana, m_taxi, EntryPointData::mountSpell, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasByType(), ResurrectPlayer(), SaveToDB(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), SPELL_AURA_MOD_SHAPESHIFT, and EntryPointData::taxiPath.

Referenced by WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ProcessSpellQueue()

void Player::ProcessSpellQueue ( )
protected
2377{
2378 while (!SpellQueue.empty())
2379 {
2380 PendingSpellCastRequest& request = SpellQueue.front(); // Peek at the first spell
2381 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(request.spellId);
2382 if (!spellInfo)
2383 {
2384 LOG_ERROR("entities.player", "Player::ProcessSpellQueue: Invalid spell {}", request.spellId);
2385 SpellQueue.clear();
2386 break;
2387 }
2388 if (CanExecutePendingSpellCastRequest(spellInfo))
2389 {
2391
2392 // ExecuteOrCancelSpellCastRequest() can lead to clearing the SpellQueue.
2393 // Example scenario:
2394 // Handling a spell → Dealing damage to yourself (e.g., spell_pri_vampiric_touch) →
2395 // Killing yourself → Player::setDeathState() → SpellQueue.clear().
2396 // Calling std::deque::pop_front() on an empty deque results in undefined behavior,
2397 // so an additional check is added.
2398 if (!SpellQueue.empty())
2399 SpellQueue.pop_front();
2400 }
2401 else // If the first spell can't execute, stop processing
2402 break;
2403 }
2404}
uint32 spellId
Definition: Player.h:1071
bool CanExecutePendingSpellCastRequest(SpellInfo const *spellInfo)
Definition: PlayerUpdates.cpp:2311
void ExecuteOrCancelSpellCastRequest(PendingSpellCastRequest *castRequest, bool isCancel=false)
Definition: PlayerUpdates.cpp:2362

References CanExecutePendingSpellCastRequest(), ExecuteOrCancelSpellCastRequest(), LOG_ERROR, PendingSpellCastRequest::spellId, SpellQueue, and sSpellMgr.

Referenced by Update().

◆ ProcessTerrainStatusUpdate()

void Player::ProcessTerrainStatusUpdate ( )
overridevirtual

Reimplemented from Unit.

2252{
2253 // process liquid auras using generic unit code
2255
2256 LiquidData const& liquidData = GetLiquidData();
2257
2258 // player specific logic for mirror timers
2259 if (liquidData.Status != LIQUID_MAP_NO_WATER)
2260 {
2261 // Breath bar state (under water in any liquid type)
2262 if ((liquidData.Flags & MAP_ALL_LIQUIDS) != 0)
2263 {
2264 if ((liquidData.Status & LIQUID_MAP_UNDER_WATER) != 0)
2266 else
2267 m_MirrorTimerFlags &= ~UNDERWATER_INWATER;
2268 }
2269
2270 // Fatigue bar state (if not on flight path or transport)
2271 if ((liquidData.Flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport())
2272 {
2273 // Exclude also uncontrollable vehicles
2274 Vehicle* vehicle = GetVehicle();
2275 VehicleSeatEntry const* vehicleSeat = vehicle ? vehicle->GetSeatForPassenger(this) : nullptr;
2276 if (!vehicleSeat || vehicleSeat->CanControl())
2278 else
2279 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2280 }
2281 else
2282 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2283
2284 // Lava state (any contact)
2285 if (liquidData.Flags & MAP_LIQUID_TYPE_MAGMA)
2286 {
2287 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2289 else
2290 m_MirrorTimerFlags &= ~UNDERWATER_INLAVA;
2291 }
2292
2293 // Slime state (any contact)
2294 if (liquidData.Flags & MAP_LIQUID_TYPE_SLIME)
2295 {
2296 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2298 else
2299 m_MirrorTimerFlags &= ~UNDERWATER_INSLIME;
2300 }
2301 }
2302 else
2304}
@ UNDERWATER_INSLIME
Definition: Player.h:103
#define MAP_LIQUID_TYPE_MAGMA
Definition: GridTerrainData.h:37
@ LIQUID_MAP_UNDER_WATER
Definition: GridTerrainData.h:195
@ LIQUID_MAP_NO_WATER
Definition: GridTerrainData.h:191
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: GridTerrainData.h:32
#define MAP_LIQUID_TYPE_DARK_WATER
Definition: GridTerrainData.h:42
#define MAP_LIQUID_TYPE_SLIME
Definition: GridTerrainData.h:38
#define MAP_ALL_LIQUIDS
Definition: GridTerrainData.h:40
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3181
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4293
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger)
Definition: Vehicle.cpp:598
Definition: GridTerrainData.h:199
uint32 Flags
Definition: GridTerrainData.h:203
LiquidStatus Status
Definition: GridTerrainData.h:206
Definition: DBCStructure.h:2065
bool CanControl() const
Definition: DBCStructure.h:2128

References VehicleSeatEntry::CanControl(), LiquidData::Flags, WorldObject::GetLiquidData(), Vehicle::GetSeatForPassenger(), WorldObject::GetTransport(), Unit::GetVehicle(), Unit::IsInFlight(), LIQUID_MAP_NO_WATER, LIQUID_MAP_UNDER_WATER, m_MirrorTimerFlags, MAP_ALL_LIQUIDS, MAP_LIQUID_STATUS_IN_CONTACT, MAP_LIQUID_TYPE_DARK_WATER, MAP_LIQUID_TYPE_MAGMA, MAP_LIQUID_TYPE_SLIME, Unit::ProcessTerrainStatusUpdate(), LiquidData::Status, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INSLIME, and UNDERWATER_INWATER.

◆ ProhibitSpellSchool()

void Player::ProhibitSpellSchool ( SpellSchoolMask  idSchoolMask,
uint32  unTimeMs 
)
overridevirtual

Reimplemented from Unit.

10488{
10489 PacketCooldowns cooldowns;
10490 WorldPacket data;
10491
10492 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
10493 {
10494 if (itr->second->State == PLAYERSPELL_REMOVED)
10495 continue;
10496 uint32 unSpellId = itr->first;
10497 SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(unSpellId);
10498
10499 // Not send cooldown for this spells
10500 if (spellInfo->IsCooldownStartedOnEvent())
10501 continue;
10502
10504 continue;
10505
10506 if ((idSchoolMask & spellInfo->GetSchoolMask()) && GetSpellCooldownDelay(unSpellId) < unTimeMs)
10507 {
10508 cooldowns[unSpellId] = unTimeMs;
10509 AddSpellCooldown(unSpellId, 0, unTimeMs, true);
10510 }
10511 }
10512
10513 if (!cooldowns.empty())
10514 {
10516 GetSession()->SendPacket(&data);
10517 }
10518}
@ SPELL_PREVENTION_TYPE_SILENCE
Definition: SharedDefines.h:1554
uint32 PreventionType
Definition: SpellInfo.h:390
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1212
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1987

References AddSpellCooldown(), Unit::BuildCooldownPacket(), SpellInfo::GetSchoolMask(), GetSession(), GetSpellCooldownDelay(), SpellInfo::IsCooldownStartedOnEvent(), m_spells, PLAYERSPELL_REMOVED, SpellInfo::PreventionType, WorldSession::SendPacket(), SPELL_COOLDOWN_FLAG_NONE, SPELL_PREVENTION_TYPE_SILENCE, and sSpellMgr.

◆ QuickEquipItem()

void Player::QuickEquipItem ( uint16  pos,
Item pItem 
)
2836{
2837 if (pItem)
2838 {
2840 AddItemDurations(pItem);
2841
2842 uint8 slot = pos & 255;
2843 VisualizeItem(slot, pItem);
2844
2845 if (IsInWorld())
2846 {
2847 pItem->AddToWorld();
2848 pItem->SendUpdateToPlayer(this);
2849 }
2850
2853
2854 sScriptMgr->OnPlayerEquip(this, pItem, (pos >> 8), slot, true);
2855 }
2856}

References ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), AddItemDurations(), Object::AddToWorld(), Object::GetEntry(), Object::IsInWorld(), Object::SendUpdateToPlayer(), sScriptMgr, UpdateAchievementCriteria(), and VisualizeItem().

Referenced by _LoadInventory().

◆ RecalculateRating()

void Player::RecalculateRating ( CombatRating  cr)
inline
1970{ ApplyRatingMod(cr, 0, true);}

References ApplyRatingMod().

Referenced by DestroyItem(), EquipItem(), RemoveItem(), and UpdateAllStats().

◆ RefundItem()

void Player::RefundItem ( Item item)
private

Already checked before

15533{
15534 if (!item->IsRefundable())
15535 {
15536 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15537 return;
15538 }
15539
15540 if (item->IsRefundExpired()) // item refund has expired
15541 {
15542 item->SetNotRefundable(this);
15544 data << item->GetGUID(); // Guid
15545 data << uint32(10); // Error!
15546 GetSession()->SendPacket(&data);
15547 return;
15548 }
15549
15550 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15551 {
15552 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15553 item->SetNotRefundable(this);
15554 return;
15555 }
15556
15557 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15558 if (!iece)
15559 {
15560 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15561 return;
15562 }
15563
15564 bool store_error = false;
15565 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15566 {
15567 uint32 count = iece->reqitemcount[i];
15568 uint32 itemid = iece->reqitem[i];
15569
15570 if (count && itemid)
15571 {
15572 ItemPosCountVec dest;
15573 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15574 if (msg != EQUIP_ERR_OK)
15575 {
15576 store_error = true;
15577 break;
15578 }
15579 }
15580 }
15581
15582 if (store_error)
15583 {
15585 data << item->GetGUID(); // Guid
15586 data << uint32(10); // Error!
15587 GetSession()->SendPacket(&data);
15588 return;
15589 }
15590
15591 WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4 + 4 + 4 + 4 + 4 * 4 + 4 * 4);
15592 data << item->GetGUID(); // item guid
15593 data << uint32(0); // 0, or error code
15594 data << uint32(item->GetPaidMoney()); // money cost
15595 data << uint32(iece->reqhonorpoints); // honor point cost
15596 data << uint32(iece->reqarenapoints); // arena point cost
15597 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15598 {
15599 data << uint32(iece->reqitem[i]);
15600 data << uint32(iece->reqitemcount[i]);
15601 }
15602 GetSession()->SendPacket(&data);
15603
15604 uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem
15605
15606 // Save all relevant data to DB to prevent desynchronisation exploits
15607 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15608
15609 // Delete any references to the refund data
15610 item->SetNotRefundable(this, true, &trans);
15611
15612 // Destroy item
15613 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
15614
15615 // Grant back extendedcost items
15616 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15617 {
15618 uint32 count = iece->reqitemcount[i];
15619 uint32 itemid = iece->reqitem[i];
15620 if (count && itemid)
15621 {
15622 ItemPosCountVec dest;
15623 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15624 ASSERT(msg == EQUIP_ERR_OK);
15625 Item* it = StoreNewItem(dest, itemid, true);
15626 SendNewItem(it, count, true, false, true);
15627 }
15628 }
15629
15630 // Grant back money
15631 if (moneyRefund)
15632 ModifyMoney(moneyRefund); // Saved in SaveInventoryAndGoldToDB
15633
15634 // Grant back Honor points
15635 if (uint32 honorRefund = iece->reqhonorpoints)
15636 ModifyHonorPoints(honorRefund, trans);
15637
15638 // Grant back Arena points
15639 if (uint32 arenaRefund = iece->reqarenapoints)
15640 ModifyArenaPoints(arenaRefund, trans);
15641
15643
15644 CharacterDatabase.CommitTransaction(trans);
15645}
@ SMSG_ITEM_REFUND_RESULT
Definition: Opcodes.h:1235
uint32 GetPaidExtendedCost()
Definition: Item.h:349
uint32 GetPaidMoney()
Definition: Item.h:348
ObjectGuid::LowType GetRefundRecipient()
Definition: Item.h:347
bool IsRefundExpired()
Definition: Item.cpp:1253
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7121

References ASSERT, CanStoreNewItem(), CharacterDatabase, DestroyItem(), EQUIP_ERR_OK, Item::GetBagSlot(), Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetRefundRecipient(), GetSession(), Item::GetSlot(), Item::IsRefundable(), Item::IsRefundExpired(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, SaveInventoryAndGoldToDB(), SendNewItem(), WorldSession::SendPacket(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_RESULT, and StoreNewItem().

Referenced by WorldSession::HandleItemRefund().

◆ Regenerate()

void Player::Regenerate ( Powers  power)
Todo:
: possible use of miscvalueb instead of amount
1846{
1847 uint32 maxValue = GetMaxPower(power);
1848 if (!maxValue)
1849 return;
1850
1851 //If .cheat power is on always have the max power
1853 {
1854 if (m_regenTimerCount >= 2000)
1855 {
1856 //Set the value to 0 first then set it to max to force resend of packet as for range clients keeps removing rage
1857 if (power == POWER_RAGE || power == POWER_RUNIC_POWER)
1858 {
1859 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, 0);
1860 }
1861
1862 SetPower(power, maxValue);
1863 return;
1864 }
1865 }
1866
1867 uint32 curValue = GetPower(power);
1868
1871 return;
1872
1873 float addvalue = 0.0f;
1874
1875 switch (power)
1876 {
1877 case POWER_MANA:
1878 {
1879 bool recentCast = IsUnderLastManaUseEffect();
1880 float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
1881
1882 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1883 ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (GetLevel() * 0.066f));
1884
1885 if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
1887 else
1889 }
1890 break;
1891 case POWER_RAGE: // Regenerate rage
1892 {
1893 if (!IsInCombat() && !HasInterruptRegenAura())
1894 {
1895 float RageDecreaseRate = sWorld->getRate(RATE_POWER_RAGE_LOSS);
1896 addvalue += -20 * RageDecreaseRate; // 2 rage by tick (= 2 seconds => 1 rage/sec)
1897 }
1898 }
1899 break;
1900 case POWER_ENERGY: // Regenerate energy (rogue)
1901 // Regen per second
1903 // Regen per millisecond
1904 addvalue *= 0.001f;
1905 // Milliseconds passed
1906 addvalue *= m_regenTimer;
1907 // Rate
1908 addvalue *= sWorld->getRate(RATE_POWER_ENERGY);
1909 break;
1910 case POWER_RUNIC_POWER:
1911 {
1912 if (!IsInCombat() && !HasInterruptRegenAura())
1913 {
1914 float RunicPowerDecreaseRate = sWorld->getRate(RATE_POWER_RUNICPOWER_LOSS);
1915 addvalue += -30 * RunicPowerDecreaseRate; // 3 RunicPower by tick
1916 }
1917 }
1918 break;
1919 case POWER_RUNE:
1920 case POWER_FOCUS:
1921 case POWER_HAPPINESS:
1922 break;
1923 case POWER_HEALTH:
1924 return;
1925 default:
1926 break;
1927 }
1928
1929 // Mana regen calculated in Player::UpdateManaRegen(), energy regen calculated in Player::UpdateEnergyRegen()
1930 if (power != POWER_MANA && power != POWER_ENERGY)
1931 {
1933 for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
1934 if (Powers((*i)->GetMiscValue()) == power)
1935 AddPct(addvalue, (*i)->GetAmount());
1936
1937 // Butchery requires combat for this effect
1938 if (power != POWER_RUNIC_POWER || IsInCombat())
1940 }
1941
1942 if (addvalue < 0.0f)
1943 {
1944 if (curValue == 0)
1945 return;
1946 }
1947 else if (addvalue > 0.0f)
1948 {
1949 if (curValue == maxValue)
1950 return;
1951 }
1952 else
1953 return;
1954
1955 addvalue += m_powerFraction[power];
1956 uint32 integerValue = uint32(std::fabs(addvalue));
1957
1958 if (addvalue < 0.0f)
1959 {
1960 if (curValue > integerValue)
1961 {
1962 curValue -= integerValue;
1963 m_powerFraction[power] = addvalue + integerValue;
1964 }
1965 else
1966 {
1967 curValue = 0;
1968 m_powerFraction[power] = 0;
1969 }
1970 }
1971 else
1972 {
1973 curValue += integerValue;
1974
1975 if (curValue >= maxValue)
1976 {
1977 curValue = maxValue;
1978 m_powerFraction[power] = 0;
1979 }
1980 else
1981 m_powerFraction[power] = addvalue - integerValue;
1982 }
1983
1984 if (m_regenTimerCount >= 2000 || curValue == 0 || curValue == maxValue)
1985 SetPower(power, curValue, true, true);
1986 else
1988}
@ UNIT_FIELD_POWER1
Definition: UpdateFields.h:97
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
Definition: UpdateFields.h:113
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
Definition: UpdateFields.h:112
@ CHEAT_POWER
Definition: Player.h:1008
@ SPELL_AURA_MOD_POWER_REGEN
Definition: SpellAuraDefines.h:148
@ SPELL_AURA_PREVENT_REGENERATE_POWER
Definition: SpellAuraDefines.h:357
@ CONFIG_LOW_LEVEL_REGEN_BOOST
Definition: IWorld.h:176
@ RATE_POWER_RAGE_LOSS
Definition: IWorld.h:439
@ RATE_POWER_RUNICPOWER_LOSS
Definition: IWorld.h:441
@ RATE_POWER_ENERGY
Definition: IWorld.h:443
@ RATE_POWER_MANA
Definition: IWorld.h:437
@ POWER_HEALTH
Definition: SharedDefines.h:278
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:619
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:663
bool IsUnderLastManaUseEffect() const
Definition: Unit.cpp:17276
bool HasInterruptRegenAura() const
Definition: Unit.h:1714
bool HasAuraTypeWithMiscvalue(AuraType auratype, int32 miscvalue) const
Definition: Unit.cpp:5785

References AddPct(), AsUnderlyingType(), CHEAT_POWER, CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), GetCommandStatus(), Object::GetFloatValue(), Unit::GetLevel(), Unit::GetMaxPower(), Unit::GetPower(), Unit::GetTotalAuraModifierByMiscValue(), Unit::HasAuraTypeWithMiscvalue(), Unit::HasInterruptRegenAura(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsUnderLastManaUseEffect(), m_powerFraction, Unit::m_regenTimer, m_regenTimerCount, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, RATE_POWER_ENERGY, RATE_POWER_MANA, RATE_POWER_RAGE_LOSS, RATE_POWER_RUNICPOWER_LOSS, Unit::SetPower(), SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, sWorld, UNIT_FIELD_POWER1, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, and Object::UpdateUInt32Value().

Referenced by RegenerateAll().

◆ RegenerateAll()

void Player::RegenerateAll ( )
1763{
1764 //if (m_regenTimer <= 500)
1765 // return;
1766
1769
1771
1773
1774 // Runes act as cooldowns, and they don't need to send any data
1776 for (uint8 i = 0; i < MAX_RUNES; ++i)
1777 {
1778 // xinef: implement grace
1779 if (int32 cd = GetRuneCooldown(i))
1780 {
1781 SetRuneCooldown(i, (cd > m_regenTimer) ? cd - m_regenTimer : 0);
1782 // start grace counter, player must be in combat and rune has to go off cooldown
1783 if (IsInCombat() && cd <= m_regenTimer)
1784 SetGracePeriod(i, m_regenTimer - cd + 1); // added 1 because m_regenTimer-cd can be equal 0
1785 }
1786 // xinef: if grace is started, increase it but no more than cap
1787 else if (uint32 grace = GetGracePeriod(i))
1788 {
1789 if (grace < RUNE_GRACE_PERIOD)
1790 SetGracePeriod(i, std::min<uint32>(grace + m_regenTimer, RUNE_GRACE_PERIOD));
1791 }
1792 }
1793
1794 if (m_regenTimerCount >= 2000)
1795 {
1796 // Not in combat or they have regeneration
1800 {
1802 }
1803
1807
1808 m_regenTimerCount -= 2000;
1809 }
1810
1811 m_regenTimer = 0;
1812
1813 // Handles the emotes for drinking and eating.
1814 // According to sniffs there is a background timer going on that repeats independed from the time window where the aura applies.
1815 // That's why we dont need to reset the timer on apply. In sniffs I have seen that the first call for the spell visual is totally random, then after
1816 // 5 seconds over and over again which confirms my theory that we have a independed timer.
1817 if (m_foodEmoteTimerCount >= 5000)
1818 {
1819 std::vector<AuraEffect*> auraList;
1822
1823 auraList.reserve(ModRegenAuras.size() + ModPowerRegenAuras.size());
1824 auraList.insert(auraList.end(), ModRegenAuras.begin(), ModRegenAuras.end());
1825 auraList.insert(auraList.end(), ModPowerRegenAuras.begin(), ModPowerRegenAuras.end());
1826
1827 for (auto itr = auraList.begin(); itr != auraList.end(); ++itr)
1828 {
1829 // Food emote comes above drinking emote if we have to decide (mage regen food for example)
1830 if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1831 {
1833 break;
1834 }
1835 else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1836 {
1838 break;
1839 }
1840 }
1841 m_foodEmoteTimerCount -= 5000;
1842 }
1843}
@ RUNE_GRACE_PERIOD
Definition: Player.h:409
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:61
@ SPELL_AURA_MOD_REGEN
Definition: SpellAuraDefines.h:147
@ SPELL_VISUAL_KIT_DRINK
Definition: SharedDefines.h:350
@ SPELL_VISUAL_KIT_FOOD
Definition: SharedDefines.h:349
void Regenerate(Powers power)
Definition: Player.cpp:1845
void RegenerateHealth()
Definition: Player.cpp:1990
bool IsPolymorphed() const
Definition: Unit.cpp:16774
void SendPlaySpellVisual(uint32 id)
Definition: Unit.cpp:18944
bool HasRegenDuringCombatAura() const
Definition: Unit.h:1740
bool HasHealthRegenInCombatAura() const
Definition: Unit.h:1739

References AURA_INTERRUPT_FLAG_NOT_SEATED, CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, Unit::GetAuraEffectsByType(), GetGracePeriod(), GetRuneCooldown(), Unit::HasHealthRegenInCombatAura(), Unit::HasRegenDuringCombatAura(), IsClass(), Unit::IsInCombat(), Unit::IsPolymorphed(), m_baseHealthRegen, m_foodEmoteTimerCount, Unit::m_regenTimer, m_regenTimerCount, MAX_RUNES, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Regenerate(), RegenerateHealth(), RUNE_GRACE_PERIOD, Unit::SendPlaySpellVisual(), SetGracePeriod(), SetRuneCooldown(), SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_REGEN, SPELL_VISUAL_KIT_DRINK, and SPELL_VISUAL_KIT_FOOD.

Referenced by Update().

◆ RegenerateHealth()

void Player::RegenerateHealth ( )
1991{
1992 uint32 curValue = GetHealth();
1993 uint32 maxValue = GetMaxHealth();
1994
1995 if (curValue >= maxValue)
1996 return;
1997
1998 float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH);
1999
2000 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
2001 HealthIncreaseRate = sWorld->getRate(RATE_HEALTH) * (2.066f - (GetLevel() * 0.066f));
2002
2003 float addvalue = 0.0f;
2004
2005 // polymorphed case
2006 if (IsPolymorphed())
2007 addvalue = (float)GetMaxHealth() / 3;
2008 // normal regen case (maybe partly in combat case)
2009 else if (!IsInCombat() || HasRegenDuringCombatAura())
2010 {
2011 addvalue = OCTRegenHPPerSpirit() * HealthIncreaseRate;
2012
2013 if (!IsStandState())
2014 {
2015 addvalue *= 1.33f;
2016 }
2017
2019 for (AuraEffectList::const_iterator i = mModHealthRegenPct.begin(); i != mModHealthRegenPct.end(); ++i)
2020 {
2021 AddPct(addvalue, (*i)->GetAmount());
2022 }
2023
2024 if (!IsInCombat())
2025 {
2027 }
2028 else if (HasRegenDuringCombatAura())
2029 {
2031 }
2032 }
2033
2034 // always regeneration bonus (including combat)
2036 addvalue += m_baseHealthRegen / 2.5f;
2037
2038 if (addvalue < 0)
2039 addvalue = 0;
2040
2041 ModifyHealth(int32(addvalue));
2042}
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition: SpellAuraDefines.h:179
@ SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
Definition: SpellAuraDefines.h:151
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition: SpellAuraDefines.h:224
@ RATE_HEALTH
Definition: IWorld.h:436
T ApplyPct(T &base, U pct)
Definition: Util.h:73
float OCTRegenHPPerSpirit()
Definition: Player.cpp:5225
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:14142
bool IsStandState() const
Definition: Unit.cpp:16753

References AddPct(), ApplyPct(), CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), Unit::GetHealth(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetTotalAuraModifier(), Unit::HasRegenDuringCombatAura(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsPolymorphed(), Unit::IsStandState(), m_baseHealthRegen, Unit::ModifyHealth(), OCTRegenHPPerSpirit(), RATE_HEALTH, SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT, SPELL_AURA_MOD_HEALTH_REGEN_PERCENT, SPELL_AURA_MOD_REGEN, SPELL_AURA_MOD_REGEN_DURING_COMBAT, and sWorld.

Referenced by RegenerateAll().

◆ removeActionButton()

void Player::removeActionButton ( uint8  button)
5646{
5647 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5648 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5649 return;
5650
5651 if (buttonItr->second.uState == ACTIONBUTTON_NEW)
5652 m_actionButtons.erase(buttonItr); // new and not saved
5653 else
5654 buttonItr->second.uState = ACTIONBUTTON_DELETED; // saved, will deleted at next save
5655
5656 LOG_DEBUG("entities.player", "Action Button {} Removed from Player {}", button, GetGUID().ToString());
5657}

References ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, Object::GetGUID(), LOG_DEBUG, m_actionButtons, and Position::ToString().

Referenced by WorldSession::HandleSetActionButtonOpcode().

◆ RemoveActiveQuest()

void Player::RemoveActiveQuest ( uint32  questId,
bool  update = true 
)
1496{
1497 QuestStatusMap::iterator itr = m_QuestStatus.find(questId);
1498 if (itr != m_QuestStatus.end())
1499 {
1500 m_QuestStatus.erase(itr);
1501 m_QuestStatusSave[questId] = false;
1502 }
1503
1504 if (update)
1505 SendQuestUpdate(questId);
1506
1507 // Xinef: area auras may change on quest remove!
1511}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), WorldObject::GetAreaId(), WorldObject::GetZoneId(), m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveAllSpellCooldown()

void Player::RemoveAllSpellCooldown ( )
3575{
3577 if (!m_spellCooldowns.empty())
3578 {
3579 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
3580 if (itr->second.end < infTime)
3581 SendClearCooldown(itr->first, this);
3582
3583 m_spellCooldowns.clear();
3584 }
3585}
void SendClearCooldown(uint32 spell_id, Unit *target)
Definition: Player.cpp:14594

References GameTime::GetGameTimeMS(), infinityCooldownDelayCheck, m_spellCooldowns, and SendClearCooldown().

Referenced by misc_commandscript::HandleCooldownCommand().

◆ RemoveAmmo()

◆ RemoveArenaEnchantments()

void Player::RemoveArenaEnchantments ( EnchantmentSlot  slot)
4226{
4227 // remove enchantments from equipped items first to clean up the m_enchantDuration list
4228 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4229 {
4230 next = itr;
4231 if (itr->slot == slot)
4232 {
4233 if (itr->item && itr->item->GetEnchantmentId(slot))
4234 {
4235 // Poisons and DK runes are enchants which are allowed on arenas
4236 if (sSpellMgr->IsArenaAllowedEnchancment(itr->item->GetEnchantmentId(slot)))
4237 {
4238 ++next;
4239 continue;
4240 }
4241 // remove from stats
4242 ApplyEnchantment(itr->item, slot, false, false);
4243 // remove visual
4244 itr->item->ClearEnchantment(slot);
4245 }
4246 // remove from update list
4247 next = m_enchantDuration.erase(itr);
4248 }
4249 else
4250 ++next;
4251 }
4252
4253 // Xinef: check arena allowed enchantments :)
4254 // remove enchants from inventory items
4255 // NOTE: no need to remove these from stats, since these aren't equipped
4256 // in inventory
4258 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4259 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4260 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4261 pItem->ClearEnchantment(slot);
4262
4263 // in inventory bags
4265 if (Bag* pBag = GetBagByPos(i))
4266 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4267 if (Item* pItem = pBag->GetItemByPos(j))
4268 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4269 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4270 pItem->ClearEnchantment(slot);
4271}

References ApplyEnchantment(), GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, m_enchantDuration, and sSpellMgr.

Referenced by Battleground::AddPlayer().

◆ RemoveArenaSpellCooldowns()

void Player::RemoveArenaSpellCooldowns ( bool  removeActivePetCooldowns = false)
3540{
3541 // remove cooldowns on spells that have < 10 min CD
3543 SpellCooldowns::iterator itr, next;
3544 for (itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); itr = next)
3545 {
3546 next = itr;
3547 ++next;
3548 SpellInfo const* spellInfo = sSpellMgr->CheckSpellInfo(itr->first);
3549 if (!spellInfo)
3550 {
3551 continue;
3552 }
3553
3555 RemoveSpellCooldown(itr->first, true);
3556 else if (spellInfo->RecoveryTime < 10 * MINUTE * IN_MILLISECONDS && spellInfo->CategoryRecoveryTime < 10 * MINUTE * IN_MILLISECONDS && itr->second.end < infTime// xinef: dont remove active cooldowns - bugz
3557 && itr->second.maxduration < 10 * MINUTE * IN_MILLISECONDS) // xinef: dont clear cooldowns that have maxduration > 10 minutes (eg item cooldowns with no spell.dbc cooldown info)
3558 RemoveSpellCooldown(itr->first, true);
3559 }
3560
3561 // pet cooldowns
3562 if (removeActivePetCooldowns)
3563 if (Pet* pet = GetPet())
3564 {
3565 // notify player
3566 for (CreatureSpellCooldowns::const_iterator itr2 = pet->m_CreatureSpellCooldowns.begin(); itr2 != pet->m_CreatureSpellCooldowns.end(); ++itr2)
3567 SendClearCooldown(itr2->first, pet);
3568
3569 // actually clear cooldowns
3570 pet->m_CreatureSpellCooldowns.clear();
3571 }
3572}
@ SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS
Definition: SharedDefines.h:547
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3523

References SpellInfo::CategoryRecoveryTime, GameTime::GetGameTimeMS(), GetPet(), SpellInfo::HasAttribute(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, SpellInfo::RecoveryTime, RemoveSpellCooldown(), SendClearCooldown(), SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS, and sSpellMgr.

Referenced by TeleportTo().

◆ RemoveAtLoginFlag()

void Player::RemoveAtLoginFlag ( AtLoginFlags  flags,
bool  persist = false 
)
14580{
14581 m_atLoginFlags &= ~flags;
14582
14583 if (persist)
14584 {
14586
14587 stmt->SetData(0, uint16(flags));
14588 stmt->SetData(1, GetGUID().GetCounter());
14589
14590 CharacterDatabase.Execute(stmt);
14591 }
14592}
@ CHAR_UPD_REM_AT_LOGIN_FLAG
Definition: CharacterDatabase.h:277

References CHAR_UPD_REM_AT_LOGIN_FLAG, CharacterDatabase, Object::GetGUID(), m_atLoginFlags, and PreparedStatementBase::SetData().

Referenced by WorldSession::HandlePlayerLoginFromDB(), LoadCorpse(), resetSpells(), Pet::resetTalents(), resetTalents(), and Pet::resetTalentsForAllPetsOf().

◆ RemoveBattlegroundQueueId()

void Player::RemoveBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12217{
12218 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12219 {
12220 if (_BgBattlegroundQueueID[i].bgQueueTypeId == val)
12221 {
12223 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12224 return;
12225 }
12226 }
12227}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BGQueueRemoveEvent::Execute(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::LogoutPlayer(), and Battleground::RemovePlayerAtLeave().

◆ RemoveBonusTalent()

void Player::RemoveBonusTalent ( uint32  count)
inline
1745{ m_extraBonusTalentCount -= count; };

References m_extraBonusTalentCount.

◆ RemoveCategoryCooldown()

void Player::RemoveCategoryCooldown ( uint32  cat)
3532{
3533 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
3534 if (i_scstore != sSpellsByCategoryStore.end())
3535 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
3536 RemoveSpellCooldown(i_scset->second, true);
3537}

References RemoveSpellCooldown(), and sSpellsByCategoryStore.

Referenced by spell_hun_readiness::HandleDummy(), spell_item_refocus::HandleDummy(), and Unit::HandleProcTriggerSpell().

◆ RemoveCorpse()

void Player::RemoveCorpse ( )
4682{
4683 if (GetCorpse())
4684 {
4686 }
4687
4688 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4689 Corpse::DeleteFromDB(GetGUID(), trans);
4690 CharacterDatabase.CommitTransaction(trans);
4691
4693}
void RemoveFromWorld() override
Definition: Corpse.cpp:52

References _corpseLocation, CharacterDatabase, Corpse::DeleteFromDB(), GetCorpse(), Object::GetGUID(), Corpse::RemoveFromWorld(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandleMoveWorldportAck().

◆ RemovedInsignia()

void Player::RemovedInsignia ( Player looterPlr)
7735{
7736 // Xinef: If player is not in battleground and not in wintergrasp
7738 return;
7739
7740 // If not released spirit, do it !
7741 if (m_deathTimer > 0)
7742 {
7743 m_deathTimer = 0;
7746 }
7747
7749
7750 // We have to convert player corpse to bones, not to be able to resurrect there
7751 // SpawnCorpseBones isn't handy, 'cos it saves player while he in BG
7752 Corpse* bones = GetMap()->ConvertCorpseToBones(GetGUID(), true);
7753 if (!bones)
7754 return;
7755
7756 // Now we must make bones lootable, and send player loot
7758
7759 // We store the level of our player in the gold field
7760 // We retrieve this information at Player::SendLoot()
7761 bones->loot.gold = GetLevel();
7762 bones->lootRecipient = looterPlr;
7763 looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA);
7764}
@ CORPSE_FIELD_DYNAMIC_FLAGS
Definition: UpdateFields.h:428
@ AREA_WINTERGRASP
Definition: AreaDefines.h:143
@ LOOT_INSIGNIA
Definition: LootMgr.h:90
@ CORPSE_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3133
Player * lootRecipient
Definition: Corpse.h:78
Loot loot
Definition: Corpse.h:77
void SendLoot(ObjectGuid guid, LootType loot_type)
Definition: Player.cpp:7773
void BuildPlayerRepop()
Definition: Player.cpp:4430
uint32 gold
Definition: LootMgr.h:322
Corpse * ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia=false)
Definition: Map.cpp:2812

References _corpseLocation, AREA_WINTERGRASP, BuildPlayerRepop(), Map::ConvertCorpseToBones(), CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, GetBattlegroundId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), WorldObject::GetZoneId(), Loot::gold, Corpse::loot, LOOT_INSIGNIA, Corpse::lootRecipient, m_deathTimer, RepopAtGraveyard(), SendLoot(), Object::SetFlag(), and WorldLocation::WorldRelocate().

Referenced by Spell::EffectSkinPlayerCorpse().

◆ RemoveEnchantmentDurations()

void Player::RemoveEnchantmentDurations ( Item item)
4200{
4201 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4202 {
4203 if (itr->item == item)
4204 {
4205 // save duration in item
4206 item->SetEnchantmentDuration(EnchantmentSlot(itr->slot), itr->leftduration, this);
4207 itr = m_enchantDuration.erase(itr);
4208 }
4209 else
4210 ++itr;
4211 }
4212}
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player *owner)
Definition: Item.cpp:941

References m_enchantDuration, and Item::SetEnchantmentDuration().

Referenced by _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveEnchantmentDurationsReferences()

void Player::RemoveEnchantmentDurationsReferences ( Item item)
4215{
4216 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4217 {
4218 if (itr->item == item)
4219 itr = m_enchantDuration.erase(itr);
4220 else
4221 ++itr;
4222 }
4223}

References m_enchantDuration.

Referenced by _SaveInventory().

◆ RemoveFromBattlegroundOrBattlefieldRaid()

void Player::RemoveFromBattlegroundOrBattlefieldRaid ( )
13046{
13047 //remove existing reference
13048 m_group.unlink();
13049 if (Group* group = GetOriginalGroup())
13050 {
13051 m_group.link(group, this);
13053 }
13054 SetOriginalGroup(nullptr);
13055}
void unlink()
Definition: Reference.h:62
void link(TO *toObj, FROM *fromObj)
Definition: Reference.h:45
void SetOriginalGroup(Group *group, int8 subgroup=-1)
Definition: Player.cpp:13057
Group * GetOriginalGroup()
Definition: Player.h:2493
uint8 GetOriginalSubGroup() const
Definition: Player.h:2495
void setSubGroup(uint8 pSubGroup)
Definition: GroupReference.h:39

References GetOriginalGroup(), GetOriginalSubGroup(), Reference< TO, FROM >::link(), m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::Disband(), and Group::RemoveMember().

◆ RemoveFromGroup() [1/2]

void Player::RemoveFromGroup ( Group group,
ObjectGuid  guid,
RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT,
ObjectGuid  kicker = ObjectGuid::Empty,
const char *  reason = nullptr 
)
static
2352{
2353 if (group)
2354 {
2355 group->RemoveMember(guid, method, kicker, reason);
2356 group = nullptr;
2357 }
2358}
bool RemoveMember(ObjectGuid guid, const RemoveMethod &method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Group.cpp:545

References Group::RemoveMember().

Referenced by DeleteFromDB(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::LogoutPlayer(), and lfg::LFGMgr::UpdateBoot().

◆ RemoveFromGroup() [2/2]

void Player::RemoveFromGroup ( RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT)
inline
1897{ RemoveFromGroup(GetGroup(), GetGUID(), method); }

References GetGroup(), Object::GetGUID(), and RemoveFromGroup().

Referenced by RemoveFromGroup().

◆ RemoveFromWhisperWhiteList()

void Player::RemoveFromWhisperWhiteList ( ObjectGuid  guid)
inline
2571{ WhisperList.remove(guid); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ RemoveFromWorld()

void Player::RemoveFromWorld ( )
overridevirtual
  • Release charmed creatures, unsummon totems and remove pets/guardians
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be removed when logging out

Reimplemented from WorldObject.

1720{
1721 // cleanup
1722 if (IsInWorld())
1723 {
1728 ClearComboPoints(); // pussywizard: crashfix
1729 ClearComboPointHolders(); // pussywizard: crashfix
1730 if (ObjectGuid lguid = GetLootGUID()) // pussywizard: crashfix
1731 m_session->DoLootRelease(lguid);
1732 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1733 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1734 sWorldState->HandlePlayerLeaveZone(this, static_cast<AreaTableIDs>(m_zoneUpdateId));
1735 }
1736
1737 // Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
1738 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1739 {
1740 if (m_items[i])
1742 }
1743
1744 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
1745 iter->second->RemoveFromWorld();
1746
1751
1752 if (m_uint32Values)
1753 {
1754 if (WorldObject* viewpoint = GetViewpoint())
1755 {
1756 LOG_FATAL("entities.player", "Player {} has viewpoint {} {} when removed from world", GetName(), viewpoint->GetEntry(), viewpoint->GetTypeId());
1757 SetViewpoint(viewpoint, false);
1758 }
1759 }
1760}
AreaTableIDs
Definition: AreaDefines.h:24
#define sWorldState
Definition: WorldState.h:202
#define LOG_FATAL(filterType__,...)
Definition: Log.h:153
void SetViewpoint(WorldObject *target, bool apply)
Definition: Player.cpp:13114
void UnsummonPetTemporaryIfAny()
Definition: Player.cpp:14160
WorldObject * GetViewpoint() const
Definition: Player.cpp:13157
void ClearComboPointHolders()
Definition: Unit.cpp:16952
void RemoveFromWorld() override
Definition: Unit.cpp:15733
void DoLootRelease(ObjectGuid lguid)
Definition: LootHandler.cpp:270

References Unit::ClearComboPointHolders(), Unit::ClearComboPoints(), WorldSession::DoLootRelease(), GetLootGUID(), WorldObject::GetName(), GetViewpoint(), Object::IsInWorld(), LOG_FATAL, m_items, m_session, Object::m_uint32Values, m_zoneUpdateId, mMitems, PLAYER_SLOT_END, PLAYER_SLOT_START, Object::RemoveFromWorld(), Unit::RemoveFromWorld(), sBattlefieldMgr, SetViewpoint(), sOutdoorPvPMgr, StopCastingBindSight(), StopCastingCharm(), sWorldState, and UnsummonPetTemporaryIfAny().

Referenced by Map::RemovePlayerFromMap().

◆ RemoveItem()

void Player::RemoveItem ( uint8  bag,
uint8  slot,
bool  update,
bool  swap = false 
)
2900{
2901 // note: removeitem does not actually change the item
2902 // it only takes the item out of storage temporarily
2903 // note2: if removeitem is to be used for delinking
2904 // the item must be removed from the player's updatequeue
2905
2906 Item* pItem = GetItemByPos(bag, slot);
2907 if (pItem)
2908 {
2909 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
2910
2912 RemoveItemDurations(pItem);
2913 RemoveTradeableItem(pItem);
2914
2915 if (bag == INVENTORY_SLOT_BAG_0)
2916 {
2917 if (slot < INVENTORY_SLOT_BAG_END)
2918 {
2919 ItemTemplate const* pProto = pItem->GetTemplate();
2920 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2921
2922 if (pProto && pProto->ItemSet)
2923 RemoveItemsSetItem(this, pProto);
2924
2925 _ApplyItemMods(pItem, slot, false);
2926 }
2927
2928 m_items[slot] = nullptr;
2929
2930 // remove item dependent auras and casts (only weapon and armor slots)
2931 if (slot < INVENTORY_SLOT_BAG_END && slot < EQUIPMENT_SLOT_END)
2932 {
2933 // Xinef: Ensure that this function is called for places with swap=true
2934 if (!swap)
2935 {
2937 }
2938
2939 // remove held enchantments, update expertise
2940 if (slot == EQUIPMENT_SLOT_MAINHAND)
2941 {
2943 }
2944 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2945 {
2947 }
2948
2949 // update armor penetration - passive auras may need it
2950 switch (slot)
2951 {
2956 default:
2957 break;
2958 }
2959 }
2960
2962
2963 if (slot < EQUIPMENT_SLOT_END)
2964 SetVisibleItemSlot(slot, nullptr);
2965 }
2966 else if (Bag* pBag = GetBagByPos(bag))
2967 pBag->RemoveItem(slot, update);
2968
2970 // pItem->SetGuidValue(ITEM_FIELD_OWNER, ObjectGuid::Empty); not clear owner at remove (it will be set at store). This used in mail and auction code
2971 pItem->SetSlot(NULL_SLOT);
2972 if (IsInWorld() && update)
2973 pItem->SendUpdateToPlayer(this);
2974 }
2975}

References _ApplyItemMods(), BASE_ATTACK, CR_ARMOR_PENETRATION, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), ITEM_FIELD_CONTAINED, ItemTemplate::ItemSet, LOG_DEBUG, m_items, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), RemoveEnchantmentDurations(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Object::SetGuidValue(), Item::SetSlot(), SetVisibleItemSlot(), and UpdateExpertise().

Referenced by AutoUnequipOffhandIfNeed(), Create(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ RemoveItemDependentAurasAndCasts()

void Player::RemoveItemDependentAurasAndCasts ( Item pItem)
12529{
12530 for (AuraMap::iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end();)
12531 {
12532 Aura* aura = itr->second;
12533
12534 // skip passive (passive item dependent spells work in another way) and not self applied auras
12535 SpellInfo const* spellInfo = aura->GetSpellInfo();
12536 if (aura->IsPassive() || aura->GetCasterGUID() != GetGUID())
12537 {
12538 ++itr;
12539 continue;
12540 }
12541
12542 // skip if not item dependent or have alternative item
12543 if (HasItemFitToSpellRequirements(spellInfo, pItem))
12544 {
12545 ++itr;
12546 continue;
12547 }
12548
12549 // no alt item, remove aura, restart check
12550 RemoveOwnedAura(itr);
12551 }
12552
12553 // currently casted spells can be dependent from item
12554 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
12555 if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i)))
12556 if (spell->getState() != SPELL_STATE_DELAYED && !HasItemFitToSpellRequirements(spell->m_spellInfo, pItem))
12558}
#define CURRENT_MAX_SPELL
Definition: Unit.h:545
@ SPELL_STATE_DELAYED
Definition: Spell.h:231
bool HasItemFitToSpellRequirements(SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
Definition: Player.cpp:12466

References CURRENT_MAX_SPELL, Aura::GetCasterGUID(), Unit::GetCurrentSpell(), Object::GetGUID(), Aura::GetSpellInfo(), HasItemFitToSpellRequirements(), Unit::InterruptSpell(), Aura::IsPassive(), Unit::m_ownedAuras, Unit::RemoveOwnedAura(), and SPELL_STATE_DELAYED.

Referenced by DestroyItem(), WorldSession::HandleAutoEquipItemOpcode(), RemoveItem(), and SwapItem().

◆ RemoveItemDurations()

void Player::RemoveItemDurations ( Item item)
12391{
12392 for (ItemDurationList::iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
12393 {
12394 if (*itr == item)
12395 {
12396 m_itemDuration.erase(itr);
12397 break;
12398 }
12399 }
12400}

References m_itemDuration.

Referenced by _SaveInventory(), _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveItemFromBuyBackSlot()

void Player::RemoveItemFromBuyBackSlot ( uint32  slot,
bool  del 
)
3996{
3997 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItemFromBuyBackSlot slot = {}", slot);
3998 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
3999 {
4000 Item* pItem = m_items[slot];
4001 if (pItem)
4002 {
4003 pItem->RemoveFromWorld();
4004 if (del)
4005 pItem->SetState(ITEM_REMOVED, this);
4006 }
4007
4008 m_items[slot] = nullptr;
4009
4010 uint32 eslot = slot - BUYBACK_SLOT_START;
4014
4015 // if current backslot is filled set to now free slot
4017 m_currentBuybackSlot = slot;
4018 }
4019}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, ObjectGuid::Empty, ITEM_REMOVED, LOG_DEBUG, m_currentBuybackSlot, m_items, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, Object::RemoveFromWorld(), Object::SetGuidValue(), Item::SetState(), and Unit::SetUInt32Value().

Referenced by AddItemToBuyBackSlot(), WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ RemoveMail()

void Player::RemoveMail ( uint32  id)
2855{
2856 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
2857 {
2858 if ((*itr)->messageID == id)
2859 {
2860 //do not delete item, because Player::removeMail() is called when returning mail to sender.
2861 m_mail.erase(itr);
2862 return;
2863 }
2864 }
2865}

References m_mail.

Referenced by WorldSession::HandleMailReturnToSender().

◆ RemoveMItem()

bool Player::RemoveMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1690 {
1691 return !!mMitems.erase(itemLowGuid);
1692 }

References mMitems.

Referenced by WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ RemovePet()

void Player::RemovePet ( Pet pet,
PetSaveMode  mode,
bool  returnreagent = false 
)
9070{
9071 if (!pet)
9072 pet = GetPet();
9073
9074 if (pet)
9075 {
9076 // xinef: dont save dead pet as current, save him not in slot
9077 if (!pet->IsAlive() && mode == PET_SAVE_AS_CURRENT && pet->getPetType() == HUNTER_PET)
9078 {
9079 mode = PET_SAVE_NOT_IN_SLOT;
9081 }
9082
9083 LOG_DEBUG("entities.pet", "RemovePet {}, {}, {}", pet->GetEntry(), mode, returnreagent);
9084 if (pet->m_removed)
9085 return;
9086 }
9087
9088 if (returnreagent && (pet || (m_temporaryUnsummonedPetNumber && (!m_session || !m_session->PlayerLogout()))) && !InBattleground())
9089 {
9090 //returning of reagents only for players, so best done here
9092 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9093
9094 if (spellInfo)
9095 {
9096 for (uint32 i = 0; i < MAX_SPELL_REAGENTS; ++i)
9097 {
9098 if (spellInfo->Reagent[i] > 0)
9099 {
9100 ItemPosCountVec dest; //for succubus, voidwalker, felhunter and felguard credit soulshard when despawn reason other than death (out of range, logout)
9101 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, spellInfo->Reagent[i], spellInfo->ReagentCount[i]);
9102 if (msg == EQUIP_ERR_OK)
9103 {
9104 Item* item = StoreNewItem(dest, spellInfo->Reagent[i], true);
9105 if (IsInWorld())
9106 SendNewItem(item, spellInfo->ReagentCount[i], true, false);
9107 }
9108 }
9109 }
9110 }
9112 }
9113
9114 if (!pet)
9115 {
9116 if (mode == PET_SAVE_NOT_IN_SLOT && m_petStable && m_petStable->CurrentPet)
9117 {
9118 // Handle removing pet while it is in "temporarily unsummoned" state, for example on mount
9120 stmt->SetData(0, PET_SAVE_NOT_IN_SLOT);
9121 stmt->SetData(1, GetGUID().GetCounter());
9122 stmt->SetData(2, m_petStable->CurrentPet->PetNumber);
9123 CharacterDatabase.Execute(stmt);
9124
9125 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9126 m_petStable->CurrentPet.reset();
9127 }
9128
9129 return;
9130 }
9131 else
9132 {
9133 pet->CombatStop();
9134
9135 // only if current pet in slot
9136 pet->SavePetToDB(mode);
9137
9138 if (m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber())
9139 {
9140 if (mode == PET_SAVE_NOT_IN_SLOT)
9141 {
9142 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9143 m_petStable->CurrentPet.reset();
9144 }
9145 else if (mode == PET_SAVE_AS_DELETED)
9146 m_petStable->CurrentPet.reset();
9147 // else if (stable slots) handled in opcode handlers due to required swaps
9148 // else (current pet) doesnt need to do anything
9149 }
9150
9151 SetMinion(pet, false);
9152
9153 pet->AddObjectToRemoveList();
9154 pet->m_removed = true;
9155
9156 if (pet->isControlled())
9157 {
9159 data << uint64(0);
9160 GetSession()->SendPacket(&data);
9161
9162 if (GetGroup())
9164 }
9165
9167 {
9170 }
9171 }
9172}
@ PET_SAVE_AS_DELETED
Definition: PetDefines.h:41
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
@ GROUP_UPDATE_PET
Definition: Group.h:120
@ CHAR_UPD_CHAR_PET_SLOT_BY_ID
Definition: CharacterDatabase.h:485
#define MAX_SPELL_REAGENTS
Definition: DBCStructure.h:1640
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
void AddObjectToRemoveList()
Definition: Object.cpp:2160
PetType getPetType() const
Definition: Pet.h:52
bool isControlled() const
Definition: Pet.h:54
bool m_removed
Definition: Pet.h:142
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2484
uint32 GetPetNumber() const
Definition: CharmInfo.h:132
std::array< int32, MAX_SPELL_REAGENTS > Reagent
Definition: SpellInfo.h:373
std::array< uint32, MAX_SPELL_REAGENTS > ReagentCount
Definition: SpellInfo.h:374

References WorldObject::AddObjectToRemoveList(), CanStoreNewItem(), CHAR_UPD_CHAR_PET_SLOT_BY_ID, CharacterDatabase, Unit::CombatStop(), EQUIP_ERR_OK, CreatureTemplate::family, WorldObject::FindMap(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetPet(), CharmInfo::GetPetNumber(), Pet::getPetType(), GetSession(), Object::GetUInt32Value(), GROUP_UPDATE_PET, HUNTER_PET, InBattleground(), Unit::IsAlive(), Pet::isControlled(), Object::IsInWorld(), LOG_DEBUG, m_oldpetspell, m_petStable, Pet::m_removed, m_session, m_temporaryUnsummonedPetNumber, MAX_SPELL_REAGENTS, NeedSendSpectatorData(), NULL_BAG, NULL_SLOT, PET_SAVE_AS_CURRENT, PET_SAVE_AS_DELETED, PET_SAVE_NOT_IN_SLOT, WorldSession::PlayerLogout(), SpellInfo::Reagent, SpellInfo::ReagentCount, Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), SendNewItem(), WorldSession::SendPacket(), PreparedStatementBase::SetData(), SetGroupUpdateFlag(), Unit::SetMinion(), SMSG_PET_SPELLS, sSpellMgr, StoreNewItem(), and UNIT_CREATED_BY_SPELL.

Referenced by Spell::_cast(), ActivateSpec(), Spell::EffectSummonPet(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Pet::Remove(), resetTalents(), setDeathState(), SummonPet(), UnsummonPetTemporaryIfAny(), and Update().

◆ RemovePetitionsAndSigns()

void Player::RemovePetitionsAndSigns ( ObjectGuid  guid,
uint32  type 
)
static
10057{
10058 SignatureContainer* signatureStore = sPetitionMgr->GetSignatureStore();
10059 for (SignatureContainer::iterator itr = signatureStore->begin(); itr != signatureStore->end(); ++itr)
10060 {
10061 SignatureMap::iterator signItr = itr->second.signatureMap.find(guid);
10062 if (signItr != itr->second.signatureMap.end())
10063 {
10064 Petition const* petition = sPetitionMgr->GetPetition(itr->first);
10065 if (!petition || (type != 10 && type != petition->petitionType))
10066 continue;
10067
10068 // erase this
10069 itr->second.signatureMap.erase(signItr);
10070
10071 // send update if charter owner in game
10073 if (owner)
10074 owner->GetSession()->SendPetitionQueryOpcode(petition->petitionGuid);
10075 }
10076 }
10077
10078 if (type == 10)
10079 {
10081 stmt->SetData(0, guid.GetCounter());
10082 CharacterDatabase.Execute(stmt);
10083 }
10084 else
10085 {
10087 stmt->SetData(0, guid.GetCounter());
10088 stmt->SetData(1, uint8(type));
10089 CharacterDatabase.Execute(stmt);
10090 }
10091
10092 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
10093 if (type == 10)
10094 {
10096 stmt->SetData(0, guid.GetCounter());
10097 trans->Append(stmt);
10098
10099 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER);
10100 stmt->SetData(0, guid.GetCounter());
10101 trans->Append(stmt);
10102
10103 // xinef: clear petition store
10104 sPetitionMgr->RemovePetitionByOwnerAndType(guid, 0);
10105 }
10106 else
10107 {
10109 stmt->SetData(0, guid.GetCounter());
10110 stmt->SetData(1, uint8(type));
10111 trans->Append(stmt);
10112
10114 stmt->SetData(0, guid.GetCounter());
10115 stmt->SetData(1, uint8(type));
10116 trans->Append(stmt);
10117
10118 // xinef: clear petition store
10119 sPetitionMgr->RemovePetitionByOwnerAndType(guid, uint8(type));
10120 }
10121 CharacterDatabase.CommitTransaction(trans);
10122}
#define sPetitionMgr
Definition: PetitionMgr.h:87
std::map< ObjectGuid, Signatures > SignatureContainer
Definition: PetitionMgr.h:52
@ CHAR_DEL_PETITION_SIGNATURE
Definition: CharacterDatabase.h:237
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER
Definition: CharacterDatabase.h:453
@ CHAR_DEL_ALL_PETITION_SIGNATURES
Definition: CharacterDatabase.h:236
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE
Definition: CharacterDatabase.h:455
@ CHAR_DEL_PETITION_BY_OWNER
Definition: CharacterDatabase.h:452
@ CHAR_DEL_PETITION_BY_OWNER_AND_TYPE
Definition: CharacterDatabase.h:454
Definition: PetitionMgr.h:39
ObjectGuid petitionGuid
Definition: PetitionMgr.h:40
ObjectGuid ownerGuid
Definition: PetitionMgr.h:41
uint8 petitionType
Definition: PetitionMgr.h:42
void SendPetitionQueryOpcode(ObjectGuid petitionguid)
Definition: PetitionsHandler.cpp:278

References CHAR_DEL_ALL_PETITION_SIGNATURES, CHAR_DEL_PETITION_BY_OWNER, CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, CHAR_DEL_PETITION_SIGNATURE, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, CharacterDatabase, ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetSession(), Petition::ownerGuid, Petition::petitionGuid, Petition::petitionType, WorldSession::SendPetitionQueryOpcode(), PreparedStatementBase::SetData(), and sPetitionMgr.

Referenced by Guild::AddMember(), ArenaTeam::AddMember(), and DeleteFromDB().

◆ RemovePlayerFlag()

◆ RemoveQuestSlotState()

void Player::RemoveQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ RemoveReceivedSpectatorResetFor()

void Player::RemoveReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2596{ m_receivedSpectatorResetFor.erase(guid); }

References m_receivedSpectatorResetFor.

◆ RemoveRestFlag()

void Player::RemoveRestFlag ( RestFlag  restFlag)
16107{
16108 uint32 oldRestMask = _restFlagMask;
16109 _restFlagMask &= ~restFlag;
16110
16111 if (oldRestMask && !_restFlagMask) // only remove flag/time on the last rest state remove
16112 {
16113 _restTime = 0;
16115 }
16116}

References _restFlagMask, _restTime, PLAYER_FLAGS_RESTING, and RemovePlayerFlag().

Referenced by Update(), UpdateArea(), and UpdateZone().

◆ RemoveRestState()

void Player::RemoveRestState ( )

◆ RemoveRewardedQuest()

void Player::RemoveRewardedQuest ( uint32  questId,
bool  update = true 
)
1514{
1515 RewardedQuestSet::iterator rewItr = m_RewardedQuests.find(questId);
1516 if (rewItr != m_RewardedQuests.end())
1517 {
1518 m_RewardedQuests.erase(rewItr);
1519 m_RewardedQuestsSave[questId] = false;
1520 }
1521
1522 if (update)
1523 SendQuestUpdate(questId);
1524}

References m_RewardedQuests, m_RewardedQuestsSave, and SendQuestUpdate().

Referenced by Spell::EffectQuestClear().

◆ RemoveRunesByAuraEffect()

void Player::RemoveRunesByAuraEffect ( AuraEffect const *  aura)
13332{
13333 for (uint8 i = 0; i < MAX_RUNES; ++i)
13334 {
13335 if (m_runes->runes[i].ConvertAura == aura)
13336 {
13337 ConvertRune(i, GetBaseRune(i));
13338 SetRuneConvertAura(i, nullptr);
13339 }
13340 }
13341}
AuraEffect const * ConvertAura
Definition: Player.h:428

References RuneInfo::ConvertAura, ConvertRune(), GetBaseRune(), m_runes, MAX_RUNES, Runes::runes, and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), and AuraEffect::HandlePeriodicDummyAuraTick().

◆ removeSpell()

void Player::removeSpell ( uint32  spellId,
uint8  removeSpecMask,
bool  onlyTemporary 
)
3333{
3334 PlayerSpellMap::iterator itr = m_spells.find(spell_id);
3335 if (itr == m_spells.end())
3336 return;
3337
3338 // pussywizard: nothing to do if already removed or not in specs of removeSpecMask
3339 if (itr->second->State == PLAYERSPELL_REMOVED || (itr->second->specMask & removeSpecMask) == 0)
3340 return;
3341
3342 // pussywizard: avoid any possible bugs
3343 if (onlyTemporary && itr->second->State != PLAYERSPELL_TEMPORARY)
3344 return;
3345
3346 // pussywizard: remove non-talent higher ranks (recursive)
3347 // pussywizard: do this at the beginning, not in the middle of removing!
3348 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spell_id))
3349 if (!GetTalentSpellPos(nextSpell))
3350 removeSpell(nextSpell, removeSpecMask, onlyTemporary);
3351
3352 // xinef: if current spell has talentcost, remove spells requiring this spell
3353 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spell_id);
3354 if (GetTalentSpellCost(firstRankSpellId))
3355 {
3356 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(firstRankSpellId);
3357 for (auto spellsItr = spellsRequiringSpell.first; spellsItr != spellsRequiringSpell.second; ++spellsItr)
3358 {
3359 removeSpell(spellsItr->second, removeSpecMask, onlyTemporary);
3360 }
3361 }
3362
3363 // pussywizard: re-search, it can be corrupted in prev loop
3364 itr = m_spells.find(spell_id);
3365 if (itr == m_spells.end())
3366 return;
3367
3368 itr->second->specMask = (((uint8)itr->second->specMask) & ~removeSpecMask); // pussywizard: update specMask in map
3369
3370 // pussywizard: some more conditions needed for spells like pyroblast (shouldn't be fully removed when not available in any spec, should stay in db with specMask = 0)
3371 if (GetTalentSpellCost(firstRankSpellId) == 0 && !sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId) && itr->second->specMask == 0)
3372 {
3373 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_TEMPORARY)
3374 {
3375 delete itr->second;
3376 m_spells.erase(itr);
3377 }
3378 else
3379 itr->second->State = PLAYERSPELL_REMOVED;
3380 }
3381 else if (itr->second->State != PLAYERSPELL_NEW && itr->second->State != PLAYERSPELL_TEMPORARY)
3382 itr->second->State = PLAYERSPELL_CHANGED;
3383
3384 // xinef: this is used for talents and they are not removed in removeSpell function...
3385 // xinef: however ill leave this here just in case
3386 // pussywizard: remove owned aura obtained from currently removed spell
3387 RemoveOwnedAura(spell_id);
3388
3389 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);
3390 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3391 {
3392 // pussywizard: remove pet auras
3393 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spell_id, i))
3394 RemovePetAura(petSpell);
3395
3396 // pussywizard: remove all triggered auras
3397 if (spellInfo->Effects[i].TriggerSpell > 0)
3398 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3399 }
3400
3401 // pussywizard: update free primary prof points
3402 if (spellInfo->IsPrimaryProfessionFirstRank())
3403 {
3404 uint32 freeProfs = GetFreePrimaryProfessionPoints() + 1;
3405 if (freeProfs <= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
3406 SetFreePrimaryProfessions(freeProfs);
3407 }
3408
3409 // pussywizard: update 310 flyer
3410 if (Has310Flyer(false))
3411 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3412 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3413 Has310Flyer(true, spell_id);
3414
3415 // pussywizard: remove dependent skill
3416 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spell_id);
3417 if (spellLearnSkill)
3418 {
3419 uint32 prev_spell = sSpellMgr->GetPrevSpellInChain(spell_id);
3420
3421 if (!prev_spell) // pussywizard: first rank, remove skill
3422 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3423 else // pussywizard: search previous ranks
3424 {
3425 SpellLearnSkillNode const* prevSkill = sSpellMgr->GetSpellLearnSkill(prev_spell);
3426 while (!prevSkill && prev_spell)
3427 {
3428 prev_spell = sSpellMgr->GetPrevSpellInChain(prev_spell);
3429 prevSkill = sSpellMgr->GetSpellLearnSkill(sSpellMgr->GetFirstSpellInChain(prev_spell));
3430 }
3431
3432 if (!prevSkill) // pussywizard: not found prev skill setting, remove skill
3433 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3434 else // pussywizard: set to prev skill setting values
3435 {
3436 uint32 skill_value = GetPureSkillValue(prevSkill->skill);
3437 uint32 skill_max_value = GetPureMaxSkillValue(prevSkill->skill);
3438 uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue;
3439
3440 if (skill_value > prevSkill->value)
3441 skill_value = prevSkill->value;
3442 if (skill_max_value > new_skill_max_value)
3443 skill_max_value = new_skill_max_value;
3444
3445 SetSkill(prevSkill->skill, prevSkill->step, skill_value, skill_max_value);
3446 }
3447 }
3448 }
3449 else
3450 {
3451 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
3452 // most likely will never be used, haven't heard of cases where players unlearn a mount
3453 if (Has310Flyer(false) && spellInfo)
3454 {
3455 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3456 {
3457 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3458 if (!pSkill)
3459 continue;
3460
3461 if (_spell_idx->second->SkillLine == SKILL_MOUNTS)
3462 {
3463 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3464 {
3465 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3466 spellInfo->Effects[i].CalcValue() == 310)
3467 {
3468 Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag
3469 break;
3470 }
3471 }
3472 }
3473 }
3474 }
3475 }
3476
3477 // pussywizard: remove from spell book (can't be replaced by previous rank, because such spells can't be unlearnt)
3478 if (!onlyTemporary || ((!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL)))
3479 {
3480 sScriptMgr->OnPlayerForgotSpell(this, spell_id);
3481 SendLearnPacket(spell_id, false);
3482 }
3483}

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SpellInfo::Effects, GetFreePrimaryProfessionPoints(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetTalentSpellCost(), GetTalentSpellPos(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), SpellInfo::IsPrimaryProfessionFirstRank(), m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SendLearnPacket(), SetFreePrimaryProfessions(), SetSkill(), SpellLearnSkillNode::skill, SKILL_MOUNTS, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSkillLineStore, sSpellMgr, SpellLearnSkillNode::step, and SpellLearnSkillNode::value.

Referenced by _removeTalentAurasAndSpells(), Spell::EffectUnlearnSpecialization(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraOverrideSpells(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), learnSkillRewardedSpells(), ProfessionUnlearnSpells(), removeSpell(), resetSpells(), resetTalents(), and SetSkill().

◆ RemoveSpellCooldown()

◆ RemoveSpellMods()

void Player::RemoveSpellMods ( Spell spell)
9958{
9959 if (!spell)
9960 return;
9961
9962 if (spell->m_appliedMods.empty())
9963 return;
9964
9965 SpellInfo const* const spellInfo = spell->m_spellInfo;
9966
9967 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9968 {
9969 for (SpellModList::const_iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end();)
9970 {
9971 SpellModifier* mod = *itr;
9972 ++itr;
9973
9974 // don't handle spells with proc_event entry defined
9975 // this is a temporary workaround, because all spellmods should be handled like that
9976 if (sSpellMgr->GetSpellProcEvent(mod->spellId))
9977 {
9978 continue;
9979 }
9980
9981 // spellmods without aura set cannot be charged
9982 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9983 continue;
9984
9985 // check if mod affected this spell
9986 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9987 if (iterMod == spell->m_appliedMods.end())
9988 continue;
9989
9990 // remove from list
9991 // leave this here, if spell have two mods it will remove 2 charges - wrong
9992 spell->m_appliedMods.erase(iterMod);
9993
9994 // MAGE T8P4 BONUS
9995 if (spellInfo->SpellFamilyName == SPELLFAMILY_MAGE)
9996 {
9997 SpellInfo const* sp = mod->ownerAura->GetSpellInfo();
9998 // Missile Barrage, Hot Streak, Brain Freeze (trigger spell - Fireball!)
9999 if (sp->SpellIconID == 3261 || sp->SpellIconID == 2999 || sp->SpellIconID == 2938)
10000 if (AuraEffect* aurEff = GetAuraEffectDummy(64869))
10001 if (roll_chance_i(aurEff->GetAmount()))
10002 {
10003 mod->charges = 1;
10004 continue;
10005 }
10006 }
10007
10009 itr = m_spellMods[i].begin();
10010 }
10011 }
10012}
#define MAX_SPELLMOD
Definition: SpellDefines.h:109
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3547
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5583
bool IsUsingCharges() const
Definition: SpellAuras.h:200
bool DropCharge(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.h:146
SpellInfo const *const m_spellInfo
Definition: Spell.h:523
uint32 SpellIconID
Definition: SpellInfo.h:380

References AURA_REMOVE_BY_EXPIRE, SpellModifier::charges, Aura::DropCharge(), Unit::GetAuraEffectDummy(), Aura::GetSpellInfo(), Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, MAX_SPELLMOD, SpellModifier::ownerAura, roll_chance_i(), SPELLFAMILY_MAGE, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SpellModifier::spellId, and sSpellMgr.

Referenced by Spell::_cast().

◆ RemoveTimedAchievement()

void Player::RemoveTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry 
)
13872{
13874}
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition: AchievementMgr.cpp:2245

References m_achievementMgr, and AchievementMgr::RemoveTimedAchievement().

Referenced by InstanceScript::DoStopTimedAchievement(), and WorldSession::HandleQuestLogRemoveQuest().

◆ RemoveTimedQuest()

void Player::RemoveTimedQuest ( uint32  quest_id)
inline
1567{ m_timedquests.erase(quest_id); }

References m_timedquests.

Referenced by FailQuest(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveTradeableItem()

◆ ReplaceAllPlayerFlags()

void Player::ReplaceAllPlayerFlags ( PlayerFlags  flags)
inline
1129{ SetUInt32Value(PLAYER_FLAGS, flags); }

References PLAYER_FLAGS, and Unit::SetUInt32Value().

Referenced by LoadFromDB().

◆ RepopAtGraveyard()

void Player::RepopAtGraveyard ( )
4928{
4929 // note: this can be called also when the player is alive
4930 // for example from WorldSession::HandleMovementOpcodes
4931
4932 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetAreaId());
4933
4934 if (!sScriptMgr->OnPlayerCanRepopAtGraveyard(this))
4935 return;
4936
4937 // Such zones are considered unreachable as a ghost and the player must be automatically revived
4938 // Xinef: Get Transport Check is not needed
4939 if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) /*|| GetTransport()*/ || GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4940 {
4941 ResurrectPlayer(0.5f);
4943 }
4944
4945 GraveyardStruct const* ClosestGrave = nullptr;
4946
4947 // Special handle for battleground maps
4948 if (Battleground* bg = GetBattleground())
4949 ClosestGrave = bg->GetClosestGraveyard(this);
4950 else
4951 {
4952 if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
4953 ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveyard(this);
4954 else
4955 ClosestGrave = sGraveyard->GetClosestGraveyard(this, GetTeamId());
4956 }
4957
4958 // stop countdown until repop
4959 m_deathTimer = 0;
4960
4961 // if no grave found, stay at the current location
4962 // and don't show spirit healer location
4963 if (ClosestGrave)
4964 {
4965 TeleportTo(ClosestGrave->Map, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation());
4966 if (isDead()) // not send if alive, because it used in TeleportTo()
4967 {
4968 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // show spirit healer position on minimap
4969 data << ClosestGrave->Map;
4970 data << ClosestGrave->x;
4971 data << ClosestGrave->y;
4972 data << ClosestGrave->z;
4973 GetSession()->SendPacket(&data);
4974 }
4975 }
4976 else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4978
4980}
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:494
#define sGraveyard
Definition: GameGraveyard.h:74
@ AREA_FLAG_NEED_FLY
Definition: DBCEnums.h:246
@ SMSG_DEATH_RELEASE_LOC
Definition: Opcodes.h:918
Definition: GameGraveyard.h:27
float z
Definition: GameGraveyard.h:32
float x
Definition: GameGraveyard.h:30
float y
Definition: GameGraveyard.h:31
uint32 Map
Definition: GameGraveyard.h:29

References AREA_FLAG_NEED_FLY, AreaTableEntry::flags, WorldObject::GetAreaId(), GetBattleground(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), GetTeamId(), WorldObject::GetZoneId(), Unit::IsAlive(), Unit::isDead(), m_deathTimer, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GraveyardStruct::Map, PLAYER_FLAGS_IS_OUT_OF_BOUNDS, RemovePlayerFlag(), ResurrectPlayer(), sAreaTableStore, sBattlefieldMgr, WorldSession::SendPacket(), sGraveyard, SMSG_DEATH_RELEASE_LOC, SpawnCorpseBones(), sScriptMgr, TeleportTo(), GraveyardStruct::x, GraveyardStruct::y, and GraveyardStruct::z.

Referenced by Spell::EffectStuck(), HandleDrowning(), WorldSession::HandleInstanceLockResponse(), WorldSession::HandleRepopRequestOpcode(), misc_commandscript::HandleUnstuckCommand(), WorldSession::LogoutPlayer(), RemovedInsignia(), TeleportTo(), Update(), and UpdateHomebindTime().

◆ ReportedAfkBy()

void Player::ReportedAfkBy ( Player reporter)

This player has been blamed to be inactive in a battleground.

11327{
11329 // Battleground also must be in progress!
11330 if (!bg || bg != reporter->GetBattleground() || GetTeamId() != reporter->GetTeamId() || bg->GetStatus() != STATUS_IN_PROGRESS)
11331 return;
11332
11333 // Xinef: 2 minutes startup + 2 minute of match
11335 return;
11336
11337 // check if player has 'Idle' or 'Inactive' debuff
11338 if (m_bgData.bgAfkReporter.find(reporter->GetGUID()) == m_bgData.bgAfkReporter.end() && !HasAura(43680) && !HasAura(43681) && reporter->CanReportAfkDueToLimit())
11339 {
11340 m_bgData.bgAfkReporter.insert(reporter->GetGUID());
11341 // by default 3 players have to complain to apply debuff
11342 if (m_bgData.bgAfkReporter.size() >= sWorld->getIntConfig(CONFIG_BATTLEGROUND_REPORT_AFK))
11343 {
11344 // cast 'Idle' spell
11345 CastSpell(this, 43680, true);
11346 m_bgData.bgAfkReporter.clear();
11347 }
11348 }
11349}
@ CONFIG_BATTLEGROUND_REPORT_AFK_TIMER
Definition: IWorld.h:313
@ CONFIG_BATTLEGROUND_REPORT_AFK
Definition: IWorld.h:314
uint32 GetStartTime() const
Definition: Battleground.h:325
bool CanReportAfkDueToLimit()
Definition: Player.cpp:11316

References BGData::bgAfkReporter, CanReportAfkDueToLimit(), Unit::CastSpell(), CONFIG_BATTLEGROUND_REPORT_AFK, CONFIG_BATTLEGROUND_REPORT_AFK_TIMER, GetBattleground(), Object::GetGUID(), Battleground::GetStartTime(), Battleground::GetStatus(), GetTeamId(), Unit::HasAura(), IN_MILLISECONDS, m_bgData, MINUTE, STATUS_IN_PROGRESS, and sWorld.

Referenced by WorldSession::HandleReportPvPAFK().

◆ ReputationChanged()

void Player::ReputationChanged ( FactionEntry const *  factionEntry)
2209{
2210 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2211 {
2212 if (uint32 questid = GetQuestSlotQuestId(i))
2213 {
2214 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2215 {
2216 if (qInfo->GetRepObjectiveFaction() == factionEntry->ID)
2217 {
2218 QuestStatusData& q_status = m_QuestStatus[questid];
2219 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2220 {
2221 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue())
2222 if (CanCompleteQuest(questid))
2223 CompleteQuest(questid);
2224 }
2225 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2226 {
2227 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue())
2228 IncompleteQuest(questid);
2229 }
2230 }
2231 }
2232 }
2233 }
2234}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by ReputationMgr::SetOneFactionReputation().

◆ ReputationChanged2()

void Player::ReputationChanged2 ( FactionEntry const *  factionEntry)
2237{
2238 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2239 {
2240 if (uint32 questid = GetQuestSlotQuestId(i))
2241 {
2242 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2243 {
2244 if (qInfo->GetRepObjectiveFaction2() == factionEntry->ID)
2245 {
2246 QuestStatusData& q_status = m_QuestStatus[questid];
2247 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2248 {
2249 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue2())
2250 if (CanCompleteQuest(questid))
2251 CompleteQuest(questid);
2252 }
2253 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2254 {
2255 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue2())
2256 IncompleteQuest(questid);
2257 }
2258 }
2259 }
2260 }
2261 }
2262}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

◆ ResetAchievementCriteria()

void Player::ResetAchievementCriteria ( AchievementCriteriaCondition  condition,
uint32  value,
bool  evenIfCriteriaComplete = false 
)
13877{
13878 m_achievementMgr->ResetAchievementCriteria(condition, value, evenIfCriteriaComplete);
13879}
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition: AchievementMgr.cpp:516

References m_achievementMgr, and AchievementMgr::ResetAchievementCriteria().

Referenced by Battleground::AddPlayer(), spell_algalon_supermassive_fail::RecalculateDamage(), Battleground::RemovePlayerAtLeave(), and setDeathState().

◆ ResetAchievements()

void Player::ResetAchievements ( )
13852{
13854}
void Reset()
Definition: AchievementMgr.cpp:492

References m_achievementMgr, and AchievementMgr::Reset().

Referenced by reset_commandscript::HandleResetAchievementsCommand().

◆ ResetAllPowers()

◆ ResetContestedPvP()

void Player::ResetContestedPvP ( )
inline
1879 {
1883 }
@ UNIT_STATE_ATTACK_PLAYER
Definition: UnitDefines.h:184
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:488
void ClearUnitState(uint32 f)
Definition: Unit.h:692

References Unit::ClearUnitState(), m_contestedPvPTimer, PLAYER_FLAGS_CONTESTED_PVP, RemovePlayerFlag(), and UNIT_STATE_ATTACK_PLAYER.

Referenced by SetGameMaster(), SetIsSpectator(), and UpdateContestedPvP().

◆ ResetDailyQuestStatus()

void Player::ResetDailyQuestStatus ( )
12103{
12104 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12105 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
12106
12107 m_DFQuests.clear(); // Dungeon Finder Quests.
12108
12109 // DB data deleted in caller
12110 m_DailyQuestChanged = false;
12112}

References m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and Unit::SetUInt32Value().

◆ ResetFarSightDistance()

void Player::ResetFarSightDistance ( )
16217{
16218 _farSightDistance.reset();
16219}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ ResetInstances()

void Player::ResetInstances ( ObjectGuid  guid,
uint8  method,
bool  isRaid 
)
static

Reset all solo instances and optionally send a message on success for each.

196{
197 switch (method)
198 {
200 {
202 if (!p || p->GetDifficulty(false) != DUNGEON_DIFFICULTY_NORMAL)
203 break;
204 std::vector<InstanceSave*> toUnbind;
205 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(DUNGEON_DIFFICULTY_NORMAL));
206 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
207 {
208 InstanceSave* instanceSave = itr->second.save;
209 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
210 if (!entry || entry->IsRaid() || !instanceSave->CanReset())
211 {
212 continue;
213 }
214
215 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
216 if (!map || map->ToInstanceMap()->Reset(method))
217 {
218 p->SendResetInstanceSuccess(instanceSave->GetMapId());
219 toUnbind.push_back(instanceSave);
220 }
221 else
222 {
223 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
224 }
225
226 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
227 }
228 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
229 {
230 sInstanceSaveMgr->UnbindAllFor(*itr);
231 }
232 }
233 break;
235 {
237 if (!p)
238 break;
239 std::vector<InstanceSave*> toUnbind;
240 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), p->GetDifficulty(isRaid));
241 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
242 {
243 InstanceSave* instanceSave = itr->second.save;
244 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
245 if (!entry || entry->IsRaid() != isRaid || !instanceSave->CanReset())
246 {
247 continue;
248 }
249
250 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
251 if (!map || map->ToInstanceMap()->Reset(method))
252 {
253 p->SendResetInstanceSuccess(instanceSave->GetMapId());
254 toUnbind.push_back(instanceSave);
255 }
256 else
257 {
258 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
259 }
260
261 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
262 }
263 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
264 sInstanceSaveMgr->UnbindAllFor(*itr);
265 }
266 break;
268 {
270 if (!p)
271 break;
272 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
273 {
274 std::vector<InstanceSave*> toUnbind;
275 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(d));
276 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
277 {
278 if (itr->second.perm)
279 continue;
280 InstanceSave* instanceSave = itr->second.save;
281 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
282 if (!map || p->FindMap() != map)
283 {
284 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
285 toUnbind.push_back(instanceSave);
286 }
287 //else
288 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
289
290 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
291 }
292 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
293 sInstanceSaveMgr->PlayerUnbindInstance(p->GetGUID(), (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
294 }
295 }
296 break;
298 {
300 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
301 {
302 std::vector<InstanceSave*> toUnbind;
303 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(guid, Difficulty(d));
304 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
305 {
306 if (itr->second.perm)
307 continue;
308 InstanceSave* instanceSave = itr->second.save;
309 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
310 if (!p || !map || p->FindMap() != map)
311 {
312 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
313 toUnbind.push_back(instanceSave);
314 }
315 //else
316 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
317 }
318 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
319 sInstanceSaveMgr->PlayerUnbindInstance(guid, (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
320 }
321 }
322 break;
323 }
324}
@ INSTANCE_RESET_GROUP_JOIN
Definition: Map.h:647
@ INSTANCE_RESET_CHANGE_DIFFICULTY
Definition: Map.h:645
@ INSTANCE_RESET_GROUP_LEAVE
Definition: Map.h:648
@ INSTANCE_RESET_ALL
Definition: Map.h:644
std::unordered_map< uint32, InstancePlayerBind > BoundInstancesMap
Definition: InstanceSaveMgr.h:46
#define MAX_DIFFICULTY
Definition: DBCEnums.h:283
void SendResetInstanceSuccess(uint32 MapId)
Definition: PlayerMisc.cpp:326
void SendResetInstanceFailed(uint32 reason, uint32 MapId)
Definition: PlayerMisc.cpp:333
uint32 GetMapId() const
Definition: InstanceSaveMgr.h:62
bool CanReset() const
Definition: InstanceSaveMgr.h:81
InstanceMap * ToInstanceMap()
Definition: Map.h:393
bool Reset(uint8 method, GuidList *globalSkipList=nullptr)
Definition: Map.cpp:2289

References InstanceSave::CanReset(), DUNGEON_DIFFICULTY_NORMAL, ObjectAccessor::FindConnectedPlayer(), WorldObject::FindMap(), GetDifficulty(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), INSTANCE_RESET_ALL, INSTANCE_RESET_CHANGE_DIFFICULTY, INSTANCE_RESET_GROUP_JOIN, INSTANCE_RESET_GROUP_LEAVE, MapEntry::IsRaid(), MAX_DIFFICULTY, InstanceMap::Reset(), SendResetInstanceFailed(), SendResetInstanceSuccess(), sInstanceSaveMgr, sMapMgr, sMapStore, and Map::ToInstanceMap().

Referenced by Group::AddMember(), Group::Disband(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), and Group::RemoveMember().

◆ ResetMap()

void Player::ResetMap ( )
overridevirtual

Reimplemented from WorldObject.

14606{
14607 // this may be called during Map::Update
14608 // after decrement+unlink, ++m_mapRefIter will continue correctly
14609 // when the first element of the list is being removed
14610 // nocheck_prev will return the padding element of the RefMgr
14611 // instead of nullptr in the case of prev
14612 GetMap()->UpdateIteratorBack(this);
14614 GetMapRef().unlink();
14615}
virtual void ResetMap()
Definition: Object.cpp:2142
MapReference & GetMapRef()
Definition: Player.h:2501
void UpdateIteratorBack(Player *player)
Definition: Map.cpp:2527

References WorldObject::GetMap(), GetMapRef(), WorldObject::ResetMap(), Reference< TO, FROM >::unlink(), and Map::UpdateIteratorBack().

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandleSetRaidDifficultyOpcode().

◆ ResetMonthlyQuestStatus()

void Player::ResetMonthlyQuestStatus ( )
12135{
12136 if (m_monthlyquests.empty())
12137 return;
12138
12139 m_monthlyquests.clear();
12140 // DB data deleted in caller
12141 m_MonthlyQuestChanged = false;
12142}

References m_MonthlyQuestChanged, and m_monthlyquests.

◆ ResetPetTalents()

void Player::ResetPetTalents ( )
8901{
8902 // This needs another gossip option + NPC text as a confirmation.
8903 // The confirmation gossip listid has the text: "Yes, please do."
8904 Pet* pet = GetPet();
8905
8906 if (!pet || pet->getPetType() != HUNTER_PET || pet->m_usedTalentCount == 0)
8907 return;
8908
8909 CharmInfo* charmInfo = pet->GetCharmInfo();
8910 if (!charmInfo)
8911 {
8912 LOG_ERROR("entities.player", "Object ({}) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().ToString());
8913 return;
8914 }
8915 pet->resetTalents();
8916 SendTalentsInfoData(true);
8917}
uint32 m_usedTalentCount
Definition: Pet.h:134
bool resetTalents()
Definition: Pet.cpp:2057

References Unit::GetCharmInfo(), Object::GetGUID(), GetPet(), Pet::getPetType(), HUNTER_PET, LOG_ERROR, Pet::m_usedTalentCount, Pet::resetTalents(), SendTalentsInfoData(), and ObjectGuid::ToString().

Referenced by OnGossipSelect(), and npc_pet_trainer::npc_pet_trainerAI::sGossipSelect().

◆ ResetSeasonalQuestStatus()

void Player::ResetSeasonalQuestStatus ( uint16  event_id)
12125{
12126 if (m_seasonalquests.empty() || m_seasonalquests[event_id].empty())
12127 return;
12128
12129 m_seasonalquests.erase(event_id);
12130 // DB data deleted in caller
12131 m_SeasonalQuestChanged = false;
12132}

References m_SeasonalQuestChanged, and m_seasonalquests.

◆ resetSpells()

void Player::resetSpells ( )
11768{
11769 // not need after this call
11772
11773 // make full copy of map (spells removed and marked as deleted at another spell remove
11774 // and we can't use original map for safe iterative with visit each spell at loop end
11775 PlayerSpellMap spellMap = GetSpellMap();
11776
11777 for (PlayerSpellMap::const_iterator iter = spellMap.begin(); iter != spellMap.end(); ++iter)
11778 removeSpell(iter->first, SPEC_MASK_ALL, false);
11779
11783}
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:194
@ AT_LOGIN_RESET_SPELLS
Definition: Player.h:607
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1781

References AT_LOGIN_RESET_SPELLS, GetSpellMap(), HasAtLoginFlag(), LearnCustomSpells(), LearnDefaultSkills(), learnQuestRewardedSpells(), RemoveAtLoginFlag(), removeSpell(), and SPEC_MASK_ALL.

Referenced by WorldSession::HandlePlayerLoginFromDB(), and reset_commandscript::HandleResetSpellsCommand().

◆ resetTalents()

bool Player::resetTalents ( bool  noResetCost = false)
3705{
3706 sScriptMgr->OnPlayerTalentsReset(this, noResetCost);
3707
3708 // xinef: remove at login flag upon talents reset
3711
3712 // xinef: get max available talent points amount
3713 uint32 talentPointsForLevel = CalculateTalentsPoints();
3714
3715 // xinef: no talent points are used, return
3716 if (m_usedTalentCount == 0)
3717 return false;
3719
3720 // xinef: check if we have enough money
3721 uint32 resetCost = 0;
3722 if (!noResetCost && !sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST))
3723 {
3724 resetCost = resetTalentsCost();
3725 if (!HasEnoughMoney(resetCost))
3726 {
3728 return false;
3729 }
3730 }
3731
3732 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
3733
3734 // xinef: reset talents
3735 for (PlayerTalentMap::iterator iter = m_talents.begin(); iter != m_talents.end(); )
3736 {
3737 PlayerTalentMap::iterator itr = iter++;
3738
3739 if (itr->second->State == PLAYERSPELL_REMOVED)
3740 continue;
3741
3742 // xinef: talent not in current spec
3743 if (!(itr->second->specMask & GetActiveSpecMask()))
3744 continue;
3745
3746 // xinef: remove talent auras
3747 _removeTalentAurasAndSpells(itr->first);
3748
3749 // xinef: check if talent learns spell to spell book
3750 TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID);
3751 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
3752
3753 bool removed = false;
3754 if (talentInfo->addToSpellBook)
3755 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3756 {
3757 removeSpell(itr->first, GetActiveSpecMask(), false);
3758 removed = true;
3759 }
3760
3761 // Xinef: send unlearn spell packet at talent remove
3762 if (!removed)
3763 SendLearnPacket(itr->first, false);
3764
3765 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3766 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3767 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3768 removeSpell(spellInfo->Effects[i].TriggerSpell, GetActiveSpecMask(), false);
3769
3770 // xinef: remove talent modifies m_talents, move itr to map begin
3772 }
3773
3774 // xinef: remove titan grip if player had it set
3775 if (m_canTitanGrip)
3776 SetCanTitanGrip(false);
3777 // xinef: remove dual wield if player does not have dual wield spell (shamans)
3778 if (!HasSpell(674) && m_canDualWield)
3779 SetCanDualWield(false);
3780
3782
3783 // pussywizard: removed saving to db, nothing important happens and saving only spells and talents may cause data integrity problems (eg. with skills saved to db)
3784 SetFreeTalentPoints(talentPointsForLevel);
3785
3786 if (!noResetCost)
3787 {
3788 ModifyMoney(-(int32)resetCost);
3791
3792 m_resetTalentsCost = resetCost;
3794 }
3795
3796 return true;
3797}
@ AT_LOGIN_RESET_TALENTS
Definition: Player.h:608
@ CONFIG_NO_RESET_TALENT_COST
Definition: IWorld.h:127
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS
Definition: DBCEnums.h:173
@ ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS
Definition: DBCEnums.h:174
uint32 resetTalentsCost() const
Definition: Player.cpp:3671

References _removeTalent(), _removeTalentAurasAndSpells(), ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, TalentEntry::addToSpellBook, AT_LOGIN_RESET_TALENTS, AutoUnequipOffhandIfNeed(), BUY_ERR_NOT_ENOUGHT_MONEY, CalculateTalentsPoints(), CONFIG_NO_RESET_TALENT_COST, SpellInfo::Effects, GetActiveSpecMask(), GameTime::GetGameTime(), HasAtLoginFlag(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasEnoughMoney(), HasSpell(), Unit::m_canDualWield, m_canTitanGrip, m_resetTalentsCost, m_resetTalentsTime, m_talents, m_usedTalentCount, MAX_SPELL_EFFECTS, ModifyMoney(), PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, RemoveAtLoginFlag(), RemovePet(), removeSpell(), resetTalentsCost(), SendBuyError(), SendLearnPacket(), Unit::SetCanDualWield(), SetCanTitanGrip(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleTalentWipeConfirmOpcode(), and InitTalentForLevel().

◆ resetTalentsCost()

uint32 Player::resetTalentsCost ( ) const
3672{
3673 // The first time reset costs 1 gold
3674 if (m_resetTalentsCost < 1 * GOLD)
3675 return 1 * GOLD;
3676 // then 5 gold
3677 else if (m_resetTalentsCost < 5 * GOLD)
3678 return 5 * GOLD;
3679 // After that it increases in increments of 5 gold
3680 else if (m_resetTalentsCost < 10 * GOLD)
3681 return 10 * GOLD;
3682 else
3683 {
3684 uint64 months = (GameTime::GetGameTime().count() - m_resetTalentsTime) / MONTH;
3685 if (months > 0)
3686 {
3687 // This cost will be reduced by a rate of 5 gold per month
3688 int32 new_cost = int32(m_resetTalentsCost - 5 * GOLD * months);
3689 // to a minimum of 10 gold.
3690 return (new_cost < 10 * GOLD ? 10 * GOLD : new_cost);
3691 }
3692 else
3693 {
3694 // After that it increases in increments of 5 gold
3695 int32 new_cost = m_resetTalentsCost + 5 * GOLD;
3696 // until it hits a cap of 50 gold.
3697 if (new_cost > 50 * GOLD)
3698 new_cost = 50 * GOLD;
3699 return new_cost;
3700 }
3701 }
3702}
@ GOLD
Definition: SharedDefines.h:253
constexpr auto MONTH
Definition: Common.h:51

References GameTime::GetGameTime(), GOLD, m_resetTalentsCost, m_resetTalentsTime, and MONTH.

Referenced by resetTalents(), and SendTalentWipeConfirm().

◆ ResetWeeklyQuestStatus()

void Player::ResetWeeklyQuestStatus ( )
12115{
12116 if (m_weeklyquests.empty())
12117 return;
12118
12119 m_weeklyquests.clear();
12120 // DB data deleted in caller
12121 m_WeeklyQuestChanged = false;
12122}

References m_WeeklyQuestChanged, and m_weeklyquests.

◆ RestoreAllSpellMods()

void Player::RestoreAllSpellMods ( uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
9951{
9952 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
9953 if (m_currentSpells[i])
9954 RestoreSpellMods(m_currentSpells[i], ownerAuraId, aura);
9955}
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9883
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:2068

References CURRENT_MAX_SPELL, Unit::m_currentSpells, and RestoreSpellMods().

◆ RestoreBaseRune()

void Player::RestoreBaseRune ( uint8  index)
13344{
13345 AuraEffect const* aura = m_runes->runes[index].ConvertAura;
13346 // If rune was converted by a non-pasive aura that still active we should keep it converted
13347 if (aura && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_PASSIVE))
13348 return;
13349 ConvertRune(index, GetBaseRune(index));
13350 SetRuneConvertAura(index, nullptr);
13351 // Don't drop passive talents providing rune convertion
13352 if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE)
13353 return;
13354 for (uint8 i = 0; i < MAX_RUNES; ++i)
13355 {
13356 if (aura == m_runes->runes[i].ConvertAura)
13357 return;
13358 }
13359 aura->GetBase()->Remove();
13360}
@ SPELL_AURA_CONVERT_RUNE
Definition: SpellAuraDefines.h:312
SpellInfo const * GetSpellInfo() const
Definition: SpellAuraEffects.h:54
AuraType GetAuraType() const
Definition: SpellAuraEffects.cpp:448
Aura * GetBase() const
Definition: SpellAuraEffects.h:49

References RuneInfo::ConvertAura, ConvertRune(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), GetBaseRune(), AuraEffect::GetSpellInfo(), SpellInfo::HasAttribute(), m_runes, MAX_RUNES, Aura::Remove(), Runes::runes, SetRuneConvertAura(), SPELL_ATTR0_PASSIVE, and SPELL_AURA_CONVERT_RUNE.

Referenced by Spell::TakeRunePower().

◆ RestoreHealthAfterDuel()

void Player::RestoreHealthAfterDuel ( )
inline
uint32 healthBeforeDuel
Definition: Player.h:3007

References healthBeforeDuel, and Unit::SetHealth().

◆ RestoreManaAfterDuel()

void Player::RestoreManaAfterDuel ( )
inline
uint32 manaBeforeDuel
Definition: Player.h:3008

References manaBeforeDuel, POWER_MANA, and Unit::SetPower().

◆ RestoreSpellMods()

void Player::RestoreSpellMods ( Spell spell,
uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
Todo:
track these changes correctly
9884{
9885 if (!spell || spell->m_appliedMods.empty())
9886 return;
9887
9888 std::list<Aura*> aurasQueue;
9889
9890 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9891 {
9892 for (SpellModList::iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end(); ++itr)
9893 {
9894 SpellModifier* mod = *itr;
9895
9896 // Spellmods without aura set cannot be charged
9897 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9898 continue;
9899
9900 // Restore only specific owner aura mods
9901 if (ownerAuraId && (ownerAuraId != mod->ownerAura->GetSpellInfo()->Id))
9902 continue;
9903
9904 if (aura && mod->ownerAura != aura)
9905 continue;
9906
9907 // Check if mod affected this spell
9908 // First, check if the mod aura applied at least one spellmod to this spell
9909 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9910 if (iterMod == spell->m_appliedMods.end())
9911 continue;
9912 // Second, check if the current mod is one of those applied by the mod aura
9913 if (!(mod->mask & spell->m_spellInfo->SpellFamilyFlags))
9914 continue;
9915
9916 // remove from list - This will be done after all mods have been gone through
9917 // to ensure we iterate over all mods of an aura before removing said aura
9918 // from applied mods (Else, an aura with two mods on the current spell would
9919 // only see the first of its modifier restored)
9920 aurasQueue.push_back(mod->ownerAura);
9921
9922 // add mod charges back to mod
9923 if (mod->charges == -1)
9924 mod->charges = 1;
9925 else
9926 mod->charges++;
9927
9928 // Do not set more spellmods than available
9929 if (mod->ownerAura->GetCharges() < mod->charges)
9930 mod->charges = mod->ownerAura->GetCharges();
9931
9932 // Skip this check for now - aura charges may change due to various reason
9934 //ASSERT (mod->ownerAura->GetCharges() <= mod->charges);
9935 }
9936 }
9937
9938 for (std::list<Aura*>::iterator itr = aurasQueue.begin(); itr != aurasQueue.end(); ++itr)
9939 {
9940 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(*itr);
9941 if (iterMod != spell->m_appliedMods.end())
9942 spell->m_appliedMods.erase(iterMod);
9943 }
9944
9945 // Xinef: clear the list just do be sure
9946 if (!ownerAuraId && !aura)
9947 spell->m_appliedMods.clear();
9948}
uint8 GetCharges() const
Definition: SpellAuras.h:141
flag96 SpellFamilyFlags
Definition: SpellInfo.h:388

References SpellModifier::charges, Aura::GetCharges(), Aura::GetSpellInfo(), SpellInfo::Id, Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, SpellModifier::mask, MAX_SPELLMOD, SpellModifier::ownerAura, and SpellInfo::SpellFamilyFlags.

Referenced by Spell::DoAllEffectOnTarget(), Spell::finish(), Unit::HandleDummyAuraProc(), and RestoreAllSpellMods().

◆ ResummonPetTemporaryUnSummonedIfAny()

void Player::ResummonPetTemporaryUnSummonedIfAny ( )
14176{
14178 return;
14179
14180 // not resummon in not appropriate state
14182 return;
14183
14184 if (GetPetGUID())
14185 return;
14186
14188 return;
14189
14190 Pet* newPet = new Pet(this);
14191 if (!newPet->LoadPetFromDB(this, 0, m_temporaryUnsummonedPetNumber, true))
14192 delete newPet;
14193
14195}
bool IsPetNeedBeTemporaryUnsummoned() const
Definition: Player.h:2427
uint32 GetLastPetSpell() const
Definition: Player.h:2469
bool CanResummonPet(uint32 spellid)
Definition: Player.cpp:14197

References CanResummonPet(), GetLastPetSpell(), Unit::GetPetGUID(), IsPetNeedBeTemporaryUnsummoned(), IsSpectator(), Pet::LoadPetFromDB(), and m_temporaryUnsummonedPetNumber.

Referenced by Unit::_ExitVehicle(), WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ResurectUsingRequestData()

void Player::ResurectUsingRequestData ( )

Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse

12771{
12774
12775 if (IsBeingTeleported())
12776 {
12778 return;
12779 }
12780
12781 ResurrectPlayer(0.0f, false);
12782
12785 else
12786 SetFullHealth();
12787
12790 else
12792
12793 SetPower(POWER_RAGE, 0);
12794
12796
12798}
void ScheduleDelayedOperation(uint32 operation)
Definition: Player.h:2109
float m_resurrectZ
Definition: Player.h:2853
uint32 m_resurrectMap
Definition: Player.h:2852
float m_resurrectX
Definition: Player.h:2853
float m_resurrectY
Definition: Player.h:2853

References DELAYED_RESURRECT_PLAYER, Unit::GetMaxHealth(), Unit::GetMaxPower(), Position::GetOrientation(), IsBeingTeleported(), m_resurrectHealth, m_resurrectMana, m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, POWER_ENERGY, POWER_MANA, POWER_RAGE, ResurrectPlayer(), ScheduleDelayedOperation(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), and TeleportTo().

Referenced by WorldSession::HandleResurrectResponseOpcode().

◆ ResurrectPlayer()

void Player::ResurrectPlayer ( float  restore_percent,
bool  applySickness = false 
)
4480{
4481 if (!sScriptMgr->OnPlayerCanResurrect(this))
4482 return;
4483
4484 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // remove spirit healer position
4485 data << uint32(-1);
4486 data << float(0);
4487 data << float(0);
4488 data << float(0);
4489 GetSession()->SendPacket(&data);
4490
4491 // speed change, land walk
4492
4493 // remove death flag + set aura
4495 RemoveAurasDueToSpell(20584); // speed bonuses
4496 RemoveAurasDueToSpell(8326); // SPELL_AURA_GHOST
4497
4498 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
4500
4501 setDeathState(DeathState::Alive);
4504 SetWaterWalking(false);
4505 m_deathTimer = 0;
4506
4507 // set health/powers (0- will be set in caller)
4508 if (restore_percent > 0.0f)
4509 {
4510 SetHealth(uint32(GetMaxHealth()*restore_percent));
4511 SetPower(POWER_MANA, uint32(GetMaxPower(POWER_MANA)*restore_percent));
4512 SetPower(POWER_RAGE, 0);
4514 }
4515
4516 // trigger update zone for alive state zone updates
4517 uint32 newzone, newarea;
4518 GetZoneAndAreaId(newzone, newarea);
4519 UpdateZone(newzone, newarea, true);
4520 sOutdoorPvPMgr->HandlePlayerResurrects(this, newzone);
4521
4522 if (Battleground* bg = GetBattleground())
4523 bg->HandlePlayerResurrect(this);
4524
4525 // update visibility
4527
4528 sScriptMgr->OnPlayerResurrect(this, restore_percent, applySickness);
4529
4530 if (!applySickness)
4531 {
4532 return;
4533 }
4534
4535 //Characters from level 1-10 are not affected by resurrection sickness.
4536 //Characters from level 11-19 will suffer from one minute of sickness
4537 //for each level they are above 10.
4538 //Characters level 20 and up suffer from ten minutes of sickness.
4539 int32 startLevel = sWorld->getIntConfig(CONFIG_DEATH_SICKNESS_LEVEL);
4540
4541 if (int32(GetLevel()) >= startLevel)
4542 {
4543 // set resurrection sickness
4544 CastSpell(this, 15007, true);
4545
4546 // not full duration
4547 if (int32(GetLevel()) < startLevel + 9)
4548 {
4549 int32 delta = (int32(GetLevel()) - startLevel + 1) * MINUTE;
4550
4551 if (Aura* aur = GetAura(15007, GetGUID()))
4552 {
4553 aur->SetDuration(delta * IN_MILLISECONDS);
4554 }
4555 }
4556 }
4557}
@ UNIT_BYTE1_FLAG_GROUND
Definition: UnitDefines.h:58
@ MOVE_LAND_WALK
Definition: Player.h:465
@ CONFIG_DEATH_SICKNESS_LEVEL
Definition: IWorld.h:305
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
Definition: Object.cpp:3164
void UpdateZone(uint32 newZone, uint32 newArea, bool force=false)
Definition: PlayerUpdates.cpp:1252
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: PlayerUpdates.cpp:1617

References Unit::CastSpell(), CONFIG_DEATH_SICKNESS_LEVEL, Unit::GetAura(), GetBattleground(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), GetSession(), WorldObject::GetZoneAndAreaId(), IN_MILLISECONDS, m_deathTimer, MINUTE, MOVE_LAND_WALK, MOVE_UNROOT, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasDueToSpell(), WorldSession::SendPacket(), Object::SetByteValue(), setDeathState(), Object::SetDynamicFlag(), Unit::SetHealth(), SetMovement(), Unit::SetPower(), SetWaterWalking(), SMSG_DEATH_RELEASE_LOC, sOutdoorPvPMgr, sScriptMgr, sWorld, UNIT_BYTE1_FLAG_GROUND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_BYTES_1, UpdateObjectVisibility(), and UpdateZone().

Referenced by Battleground::_ProcessResurrect(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), group_commandscript::HandleGroupReviveCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), LoadFromDB(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ ResyncRunes()

void Player::ResyncRunes ( uint8  count)
13373{
13374 WorldPacket data(SMSG_RESYNC_RUNES, 4 + count * 2);
13375 data << uint32(count);
13376 for (uint32 i = 0; i < count; ++i)
13377 {
13378 data << uint8(GetCurrentRune(i)); // rune type
13379 data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255)
13380 }
13381 GetSession()->SendPacket(&data);
13382}
@ SMSG_RESYNC_RUNES
Definition: Opcodes.h:1189
RuneType GetCurrentRune(uint8 index) const
Definition: Player.h:2517

References GetCurrentRune(), GetRuneCooldown(), GetSession(), WorldSession::SendPacket(), and SMSG_RESYNC_RUNES.

◆ RewardExtraBonusTalentPoints()

void Player::RewardExtraBonusTalentPoints ( uint32  bonusTalentPoints)

A talent point boost. Usage: 1). Hot update situation (occurred when character is online, like PlayerScript:OnAchiComplete): Right after calling this function, character can reward talent points by calling function player->InitTalentForLevel().

2). Data initing situation (like PlayerScript:OnLoadFromDB)

6075{
6076 if (bonusTalentPoints)
6077 {
6078 m_extraBonusTalentCount += bonusTalentPoints;
6079 }
6080}

References m_extraBonusTalentCount.

◆ RewardHonor()

bool Player::RewardHonor ( Unit uVictim,
uint32  groupsize,
int32  honor = -1,
bool  awardXP = true 
)

Calculate the amount of honor gained based on the victim and the size of the group for which the honor is divided An exact honor value can also be given (overriding the calcs)

6086{
6087 // do not reward honor in arenas, but enable onkill spellproc
6088 if (InArena())
6089 {
6090 if (!uVictim || uVictim == this || !uVictim->IsPlayer())
6091 return false;
6092
6093 if (GetBgTeamId() == uVictim->ToPlayer()->GetBgTeamId())
6094 return false;
6095
6096 return true;
6097 }
6098
6099 // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
6101 return false;
6102
6103 /* check if player has same IP
6104 if (uVictim && uVictim->IsPlayer())
6105 {
6106 if (GetSession()->GetRemoteAddress() == uVictim->ToPlayer()->GetSession()->GetRemoteAddress())
6107 return false;
6108 }
6109 */
6110
6111 ObjectGuid victim_guid;
6112 uint32 victim_rank = 0;
6113
6114 // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
6116
6117 // do not reward honor in arenas, but return true to enable onkill spellproc
6118 if (InArena())
6119 return true;
6120
6121 // Promote to float for calculations
6122 float honor_f = (float)honor;
6123
6124 if (honor_f <= 0)
6125 {
6126 if (!uVictim || uVictim == this || uVictim->HasNoPVPCreditAura())
6127 return false;
6128
6129 victim_guid = uVictim->GetGUID();
6130
6131 if (uVictim->IsPlayer())
6132 {
6133 Player* victim = uVictim->ToPlayer();
6134
6135 if (GetTeamId() == victim->GetTeamId() && !sWorld->IsFFAPvPRealm())
6136 return false;
6137
6138 uint8 k_level = GetLevel();
6139 uint8 k_grey = Acore::XP::GetGrayLevel(k_level);
6140 uint8 v_level = victim->GetLevel();
6141
6142 if (v_level <= k_grey)
6143 return false;
6144
6145 // PLAYER_CHOSEN_TITLE VALUES DESCRIPTION
6146 // [0] Just name
6147 // [1..14] Alliance honor titles and player name
6148 // [15..28] Horde honor titles and player name
6149 // [29..38] Other title and player name
6150 // [39+] Nothing
6151 uint32 victim_title = victim->GetUInt32Value(PLAYER_CHOSEN_TITLE);
6152 uint32 killer_title = 0;
6153 sScriptMgr->OnPlayerVictimRewardBefore(this, victim, killer_title, victim_title);
6154 // Get Killer titles, CharTitlesEntry::bit_index
6155 // Ranks:
6156 // title[1..14] -> rank[5..18]
6157 // title[15..28] -> rank[5..18]
6158 // title[other] -> 0
6159 if (victim_title == 0)
6160 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6161 else if (victim_title < 15)
6162 victim_rank = victim_title + 4;
6163 else if (victim_title < 29)
6164 victim_rank = victim_title - 14 + 4;
6165 else
6166 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6167
6168 honor_f = std::ceil(Acore::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));
6169
6170 // count the number of playerkills in one day
6172 // and those in a lifetime
6180 sScriptMgr->OnPlayerVictimRewardAfter(this, victim, killer_title, victim_rank, honor_f);
6181 }
6182 else
6183 {
6184 if (!uVictim->ToCreature()->IsRacialLeader())
6185 return false;
6186
6187 honor_f = 100.0f; // ??? need more info
6188 victim_rank = 19; // HK: Leader
6189 }
6190 }
6191
6192 if (uVictim)
6193 {
6194 if (groupsize > 1)
6195 honor_f /= groupsize;
6196
6197 // apply honor multiplier from aura (not stacking-get highest)
6199 }
6200
6201 honor_f *= sWorld->getRate(RATE_HONOR);
6202 // Back to int now
6203 honor = int32(honor_f);
6204 // honor - for show honor points in log
6205 // victim_guid - for show victim name in log
6206 // victim_rank [1..4] HK: <dishonored rank>
6207 // victim_rank [5..19] HK: <alliance\horde rank>
6208 // victim_rank [0, 20+] HK: <>
6209 WorldPacket data(SMSG_PVP_CREDIT, 4 + 8 + 4);
6210 data << honor;
6211 data << victim_guid;
6212 data << victim_rank;
6213
6214 // Xinef: non quest case, quest honor obtain is send in quest reward packet
6215 if (uVictim || groupsize > 0)
6216 GetSession()->SendPacket(&data);
6217
6218 // add honor points
6219 ModifyHonorPoints(honor);
6220
6222
6223 // Xinef: Battleground experience
6224 if (awardXP)
6225 if (Battleground* bg = GetBattleground())
6226 {
6227 bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping
6228 // Xinef: Only for BG activities
6229 if (!uVictim)
6230 {
6231 uint32 xp = uint32(honor * (3 + GetLevel() * 0.30f));
6232 sScriptMgr->OnPlayerGiveXP(this, xp, nullptr, PlayerXPSource::XPSOURCE_BATTLEGROUND);
6233 GiveXP(xp, nullptr);
6234 }
6235 }
6236
6237 if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE))
6238 {
6239 if (!uVictim || uVictim == this || uVictim->HasNoPVPCreditAura())
6240 return true;
6241
6242 if (uVictim->IsPlayer())
6243 {
6244 // Check if allowed to receive it in current map
6246 if ((MapType == 1 && !InBattleground() && !IsFFAPvP())
6247 || (MapType == 2 && !IsFFAPvP())
6248 || (MapType == 3 && !InBattleground()))
6249 return true;
6250
6251 uint32 itemID = sWorld->getIntConfig(CONFIG_PVP_TOKEN_ID);
6252 int32 count = sWorld->getIntConfig(CONFIG_PVP_TOKEN_COUNT);
6253
6254 if (AddItem(itemID, count))
6255 ChatHandler(GetSession()).PSendSysMessage("You have been awarded a token for slaying another player.");
6256 }
6257 }
6258
6259 return true;
6260}
@ SPELL_AURA_MOD_HONOR_GAIN_PCT
Definition: SpellAuraDefines.h:344
@ CONFIG_PVP_TOKEN_MAP_TYPE
Definition: IWorld.h:339
@ CONFIG_PVP_TOKEN_ID
Definition: IWorld.h:340
@ CONFIG_PVP_TOKEN_COUNT
Definition: IWorld.h:341
@ CONFIG_PVP_TOKEN_ENABLE
Definition: IWorld.h:126
@ RATE_HONOR
Definition: IWorld.h:515
@ SCORE_BONUS_HONOR
Definition: BattlegroundScore.h:31
@ SPELL_AURA_PLAYER_INACTIVE
Definition: Battleground.h:136
@ ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL
Definition: DBCEnums.h:219
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL
Definition: DBCEnums.h:149
@ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE
Definition: DBCEnums.h:167
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA
Definition: DBCEnums.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL
Definition: DBCEnums.h:182
@ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS
Definition: DBCEnums.h:166
@ SMSG_PVP_CREDIT
Definition: Opcodes.h:682
std::unordered_map< std::string, Player * > MapType
Definition: ObjectAccessor.cpp:85
float hk_honor_at_level_f(uint8 level, float multiplier=1.0f)
Definition: Formulas.h:31
bool IsRacialLeader() const
Definition: Creature.h:74
void Clear()
Definition: ObjectGuid.h:138
bool AddItem(uint32 itemId, uint32 count)
Definition: Player.cpp:15501
bool IsFFAPvP()
Definition: Player.cpp:16161
TeamId GetBgTeamId() const
Definition: Player.h:2288
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:5991
bool HasNoPVPCreditAura() const
Definition: Unit.h:1715

References ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, AddItem(), AddPct(), Object::ApplyModUInt32Value(), ObjectGuid::Clear(), CONFIG_PVP_TOKEN_COUNT, CONFIG_PVP_TOKEN_ENABLE, CONFIG_PVP_TOKEN_ID, CONFIG_PVP_TOKEN_MAP_TYPE, WorldObject::GetAreaId(), GetBattleground(), GetBgTeamId(), Unit::getClass(), Acore::XP::GetGrayLevel(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxPositiveAuraModifier(), Unit::getRace(), GetSession(), GetTeamId(), Object::GetUInt32Value(), GiveXP(), Unit::HasAura(), Unit::HasNoPVPCreditAura(), Acore::Honor::hk_honor_at_level_f(), InArena(), InBattleground(), IsFFAPvP(), Object::IsPlayer(), Creature::IsRacialLeader(), ModifyHonorPoints(), PLAYER_CHOSEN_TITLE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, ChatHandler::PSendSysMessage(), RATE_HONOR, SCORE_BONUS_HONOR, WorldSession::SendPacket(), SMSG_PVP_CREDIT, SPELL_AURA_MOD_HONOR_GAIN_PCT, SPELL_AURA_PLAYER_INACTIVE, sScriptMgr, sWorld, Object::ToCreature(), Object::ToPlayer(), UpdateAchievementCriteria(), and UpdateHonorFields().

Referenced by KillRewarder::_RewardHonor(), DuelComplete(), Spell::EffectAddHonor(), OutdoorPvPSI::HandleAreaTrigger(), honor_commandscript::HandleHonorAddCommand(), honor_commandscript::HandleHonorAddKillCommand(), RewardQuest(), and Battleground::UpdatePlayerScore().

◆ RewardPlayerAndGroupAtEvent()

void Player::RewardPlayerAndGroupAtEvent ( uint32  creature_id,
WorldObject pRewardSource 
)
12680{
12681 if (!pRewardSource)
12682 return;
12683
12684 ObjectGuid creature_guid = (pRewardSource->IsCreature()) ? pRewardSource->GetGUID() : ObjectGuid::Empty;
12685
12686 // prepare data for near group iteration
12687 if (Group* group = GetGroup())
12688 {
12689 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12690 {
12691 Player* player = itr->GetSource();
12692 if (!player)
12693 continue;
12694
12695 if (!player->IsAtGroupRewardDistance(pRewardSource))
12696 continue; // member (alive or dead) or his corpse at req. distance
12697
12698 // quest objectives updated only for alive group member or dead but with not released body
12699 if (player->IsAlive() || !player->GetCorpse())
12700 player->KilledMonsterCredit(creature_id, creature_guid);
12701 }
12702 }
12703 else // if (!group)
12704 KilledMonsterCredit(creature_id, creature_guid);
12705}

References ObjectGuid::Empty, GetCorpse(), GetGroup(), Object::GetGUID(), Unit::IsAlive(), IsAtGroupRewardDistance(), Object::IsCreature(), KilledMonsterCredit(), and GroupReference::next().

Referenced by Spell::EffectKillCredit(), spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), SmartScript::ProcessAction(), and SmartAI::StopFollow().

◆ RewardPlayerAndGroupAtKill()

void Player::RewardPlayerAndGroupAtKill ( Unit victim,
bool  isBattleGround 
)
12675{
12676 KillRewarder(this, victim, isBattleGround).Reward();
12677}
Definition: KillRewarder.h:28
void Reward()
Definition: KillRewarder.cpp:268

References KillRewarder::Reward().

Referenced by Unit::Kill(), and Battleground::RewardXPAtKill().

◆ RewardQuest()

void Player::RewardQuest ( Quest const *  quest,
uint32  reward,
Object questGiver,
bool  announce = true,
bool  isLFGReward = false 
)
660{
661 //this THING should be here to protect code from quest, which cast on player far teleport as a reward
662 //should work fine, cause far teleport will be executed in Player::Update()
664
665 uint32 quest_id = quest->GetQuestId();
666
667 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
668 {
669 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
670 {
671 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->RequiredItemId[i], quest_id, true))
672 DestroyItemCount(quest->RequiredItemId[i], 9999, true);
673 else
674 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
675 }
676 }
677 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
678 {
679 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
680 {
681 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->ItemDrop[i], quest_id))
682 DestroyItemCount(quest->ItemDrop[i], 9999, true);
683 else
684 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
685 }
686 }
687
688 RemoveTimedQuest(quest_id);
689
690 std::vector<std::pair<uint32, uint32>> problematicItems;
691
692 if (quest->GetRewChoiceItemsCount())
693 {
694 if (uint32 itemId = quest->RewardChoiceItemId[reward])
695 {
696 ItemPosCountVec dest;
697 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardChoiceItemCount[reward]) == EQUIP_ERR_OK)
698 {
699 Item* item = StoreNewItem(dest, itemId, true);
700 SendNewItem(item, quest->RewardChoiceItemCount[reward], true, false, false, false);
701
702 sScriptMgr->OnPlayerQuestRewardItem(this, item, quest->RewardChoiceItemCount[reward]);
703 }
704 else
705 {
706 problematicItems.emplace_back(itemId, quest->RewardChoiceItemCount[reward]);
707 }
708 }
709 }
710
711 if (quest->GetRewItemsCount())
712 {
713 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
714 {
715 if (uint32 itemId = quest->RewardItemId[i])
716 {
717 ItemPosCountVec dest;
718 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardItemIdCount[i]) == EQUIP_ERR_OK)
719 {
720 Item* item = StoreNewItem(dest, itemId, true);
721 SendNewItem(item, quest->RewardItemIdCount[i], true, false, false, false);
722
723 sScriptMgr->OnPlayerQuestRewardItem(this, item, quest->RewardItemIdCount[i]);
724 }
725 else
726 problematicItems.emplace_back(itemId, quest->RewardItemIdCount[i]);
727 }
728 }
729 }
730
731 // Xinef: send items that couldn't be added properly by mail
732 if (!problematicItems.empty())
733 {
734 SendItemRetrievalMail(problematicItems);
735 }
736
737 RewardReputation(quest);
738
739 uint16 log_slot = FindQuestSlot(quest_id);
740 if (log_slot < MAX_QUEST_LOG_SIZE)
741 SetQuestSlot(log_slot, 0);
742
743 bool rewarded = IsQuestRewarded(quest_id) && !quest->IsDFQuest();
744
745 // Not give XP in case already completed once repeatable quest
746 uint32 XP = rewarded ? 0 : CalculateQuestRewardXP(quest);
747
748 sScriptMgr->OnPlayerQuestComputeXP(this, quest, XP);
749 int32 moneyRew = 0;
750 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->OnPlayerShouldBeRewardedWithMoneyInsteadOfExp(this))
751 {
752 moneyRew = quest->GetRewMoneyMaxLevel();
753 }
754 else
755 {
756 sScriptMgr->OnPlayerGiveXP(this, XP, nullptr, isLFGReward ? PlayerXPSource::XPSOURCE_QUEST_DF : PlayerXPSource::XPSOURCE_QUEST);
757 GiveXP(XP, nullptr, 1.0f, isLFGReward);
758 }
759
760 // Give player extra money if GetRewOrReqMoney > 0 and get ReqMoney if negative
761 if (int32 rewOrReqMoney = quest->GetRewOrReqMoney(GetLevel()))
762 {
763 moneyRew += rewOrReqMoney;
764 }
765
766 if (moneyRew)
767 {
768 ModifyMoney(moneyRew);
769
770 if (moneyRew > 0)
772 }
773
774 // honor reward
775 if (uint32 honor = quest->CalculateHonorGain(GetLevel()))
776 RewardHonor(nullptr, 0, honor);
777
778 // title reward
779 if (quest->GetCharTitleId())
780 {
781 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
782 SetTitle(titleEntry);
783 }
784
785 if (quest->GetBonusTalents())
786 {
787 m_questRewardTalentCount += quest->GetBonusTalents();
789 }
790
791 if (quest->GetRewArenaPoints())
792 ModifyArenaPoints(quest->GetRewArenaPoints());
793
794 // Send reward mail
795 if (uint32 mail_template_id = quest->GetRewMailTemplateId())
796 {
797 //- TODO: Poor design of mail system
798 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
799 if (quest->GetRewMailSenderEntry() != 0)
800 MailDraft(mail_template_id).SendMailTo(trans, this, quest->GetRewMailSenderEntry(), MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
801 else
802 MailDraft(mail_template_id).SendMailTo(trans, this, questGiver, MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
803 CharacterDatabase.CommitTransaction(trans);
804 }
805
806 if (quest->IsDaily() || quest->IsDFQuest())
807 {
808 SetDailyQuestStatus(quest_id);
809 if (quest->IsDaily())
810 {
813 }
814 }
815 else if (quest->IsWeekly())
816 SetWeeklyQuestStatus(quest_id);
817 else if (quest->IsMonthly())
818 SetMonthlyQuestStatus(quest_id);
819 else if (quest->IsSeasonal())
820 SetSeasonalQuestStatus(quest_id);
821
822 RemoveActiveQuest(quest_id, false);
823 SetRewardedQuest(quest_id);
824
825 if (announce)
826 SendQuestReward(quest, XP);
827
828 // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data)
829 if (quest->GetRewSpellCast() > 0)
830 {
831 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast());
832 if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
833 {
834 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
835 creature->CastSpell(this, quest->GetRewSpellCast(), true);
836 }
837 else
838 CastSpell(this, quest->GetRewSpellCast(), true);
839 }
840 else if (quest->GetRewSpell() > 0)
841 {
842 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
843 if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
844 {
845 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
846 creature->CastSpell(this, quest->GetRewSpell(), true);
847 }
848 else
849 CastSpell(this, quest->GetRewSpell(), true);
850 }
851
852 if (quest->GetZoneOrSort() > 0)
856
857 // pussywizard: replaced partial save with full save
858 SaveToDB(false, false);
859
860 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
861 {
864 }
865
866 SendQuestUpdate(quest_id);
867
869
870 //lets remove flag for delayed teleports
872
873 // Xinef: area auras may change on quest completion!
876
877 sScriptMgr->OnPlayerCompleteQuest(this, quest);
878}
@ MAIL_CHECK_MASK_HAS_BODY
Definition: Mail.h:51
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE
Definition: DBCEnums.h:129
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY
Definition: DBCEnums.h:128
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT
Definition: DBCEnums.h:127
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST
Definition: DBCEnums.h:131
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD
Definition: DBCEnums.h:175
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST
Definition: DBCEnums.h:141
@ SPELL_EFFECT_CREATE_ITEM
Definition: SharedDefines.h:802
bool IsUnit() const
Definition: Object.h:209
bool IsInHostileArea
Definition: Player.h:367
bool HasPvPForcingQuest() const
Definition: PlayerQuest.cpp:2495
bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
Definition: PlayerQuest.cpp:2264
uint32 CalculateQuestRewardXP(Quest const *quest)
Definition: PlayerQuest.cpp:1402
void SetMonthlyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12096
void SetSeasonalQuestStatus(uint32 quest_id)
Definition: Player.cpp:12086
void SendItemRetrievalMail(uint32 itemEntry, uint32 count)
Definition: PlayerMisc.cpp:439
void SendQuestReward(Quest const *quest, uint32 XP)
Definition: PlayerQuest.cpp:2357
void SetDailyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12038
void RewardReputation(Unit *victim)
Definition: Player.cpp:5970
void SetRewardedQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:880
void SetWeeklyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12080
void RemoveActiveQuest(uint32 questId, bool update=true)
Definition: PlayerQuest.cpp:1495
void SetMustDelayTeleport(bool setting)
Definition: Player.h:2959
bool IsSelfCast() const
Definition: SpellInfo.cpp:1090

References ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, BIND_QUEST_ITEM, Quest::CalculateHonorGain(), CalculateQuestRewardXP(), CanStoreNewItem(), Unit::CastSpell(), CharacterDatabase, CONFIG_MAX_PLAYER_LEVEL, DestroyItemCount(), EQUIP_ERR_OK, FindQuestSlot(), WorldObject::GetAreaId(), Quest::GetBonusTalents(), Quest::GetCharTitleId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), Quest::GetQuestId(), Quest::GetRewArenaPoints(), Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), Quest::GetRewMailDelaySecs(), Quest::GetRewMailSenderEntry(), Quest::GetRewMailTemplateId(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetRewSpell(), Quest::GetRewSpellCast(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), GiveXP(), SpellInfo::HasEffect(), Quest::HasFlag(), HasPvPForcingQuest(), HasQuestForItem(), InitTalentForLevel(), Quest::IsDaily(), Quest::IsDFQuest(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, Quest::IsMonthly(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), SpellInfo::IsSelfCast(), Object::IsUnit(), Quest::IsWeekly(), Quest::ItemDrop, Quest::ItemDropQuantity, m_questRewardTalentCount, MAIL_CHECK_MASK_HAS_BODY, MAX_QUEST_LOG_SIZE, ModifyArenaPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, RemoveActiveQuest(), RemoveTimedQuest(), Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, RewardHonor(), Quest::RewardItemId, Quest::RewardItemIdCount, RewardReputation(), SaveToDB(), sCharTitlesStore, SendItemRetrievalMail(), MailDraft::SendMailTo(), SendNewItem(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestUpdate(), SetDailyQuestStatus(), SetMonthlyQuestStatus(), SetMustDelayTeleport(), SetQuestSlot(), SetRewardedQuest(), SetSeasonalQuestStatus(), SetTitle(), SetWeeklyQuestStatus(), sObjectMgr, SPELL_EFFECT_CREATE_ITEM, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, StoreNewItem(), sWorld, UpdateAchievementCriteria(), UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by CompleteQuest(), lfg::LFGMgr::FinishDungeon(), and WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ RewardReputation() [1/2]

void Player::RewardReputation ( Quest const *  quest)
6021{
6022 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
6023 {
6024 if (!quest->RewardFactionId[i])
6025 continue;
6026
6027 float rep = 0.f;
6028
6029 if (quest->RewardFactionValueIdOverride[i])
6030 {
6031 rep = quest->RewardFactionValueIdOverride[i] / 100.f;
6032 }
6033 else
6034 {
6035 uint32 row = ((quest->RewardFactionValueId[i] < 0) ? 1 : 0) + 1;
6036 if (QuestFactionRewEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row))
6037 {
6038 uint32 field = std::abs(quest->RewardFactionValueId[i]);
6039 rep = static_cast<float>(questFactionRewEntry->QuestRewFactionValue[field]);
6040 }
6041 }
6042
6043 if (rep == 0.f)
6044 continue;
6045
6046 if (quest->IsDaily())
6047 {
6048 rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6049 }
6050 else if (quest->IsWeekly())
6051 {
6052 rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6053 }
6054 else if (quest->IsMonthly())
6055 {
6056 rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6057 }
6058 else if (quest->IsRepeatable())
6059 {
6060 rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6061 }
6062 else
6063 {
6064 rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6065 }
6066
6067 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->RewardFactionId[i]))
6068 {
6069 GetReputationMgr().ModifyReputation(factionEntry, rep, quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER));
6070 }
6071 }
6072}
DBCStorage< QuestFactionRewEntry > sQuestFactionRewardStore(QuestFactionRewardfmt)
#define QUEST_REPUTATIONS_COUNT
Definition: QuestDef.h:41
@ QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER
Definition: QuestDef.h:166
float CalculateReputationGain(ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
Definition: Player.cpp:5890
bool ModifyReputation(FactionEntry const *factionEntry, float standing, bool noSpillOver=false, Optional< ReputationRank > repMaxCap={})
Definition: ReputationMgr.h:117
Definition: DBCStructure.h:1459

References CalculateReputationGain(), GetQuestLevel(), GetReputationMgr(), Quest::HasSpecialFlag(), Quest::IsDaily(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), ReputationMgr::ModifyReputation(), QUEST_REPUTATIONS_COUNT, QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_WEEKLY_QUEST, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, sFactionStore, and sQuestFactionRewardStore.

◆ RewardReputation() [2/2]

void Player::RewardReputation ( Unit victim)
5971{
5972 if (!victim || victim->IsPlayer())
5973 return;
5974
5975 if (victim->ToCreature()->IsReputationRewardDisabled())
5976 return;
5977
5978 ReputationOnKillEntry const* Rep = sObjectMgr->GetReputationOnKilEntry(victim->ToCreature()->GetCreatureTemplate()->Entry);
5979 if (!Rep)
5980 return;
5981
5982 uint32 ChampioningFaction = 0;
5983
5985 {
5986 // support for: Championing - http://www.wowwiki.com/Championing
5987 Map const* map = GetMap();
5988 if (map->IsNonRaidDungeon())
5989 if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty()))
5990 if (dungeon->TargetLevel == 80)
5991 ChampioningFaction = GetChampioningFaction();
5992 }
5993
5994 TeamId teamId = GetTeamId(true); // Always check player original reputation when rewarding
5995
5996 if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE))
5997 {
5998 float donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
5999
6000 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
6001 if (factionEntry1)
6002 {
6003 GetReputationMgr().ModifyReputation(factionEntry1, donerep1, false, static_cast<ReputationRank>(Rep->ReputationMaxCap1));
6004 }
6005 }
6006
6007 if (Rep->RepFaction2 && (!Rep->TeamDependent || teamId == TEAM_HORDE))
6008 {
6009 float donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
6010
6011 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
6012 if (factionEntry2)
6013 {
6014 GetReputationMgr().ModifyReputation(factionEntry2, donerep2, false, static_cast<ReputationRank>(Rep->ReputationMaxCap2));
6015 }
6016 }
6017}
LFGDungeonEntry const * GetLFGDungeon(uint32 mapId, Difficulty difficulty)
Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple ...
Definition: DBCStores.cpp:852
TeamId
Definition: SharedDefines.h:759
bool IsReputationRewardDisabled() const
Definition: Creature.h:364
uint32 Entry
Definition: CreatureData.h:187
uint32 GetChampioningFaction() const
Definition: Player.h:2560
Definition: ObjectMgr.h:568
uint32 ReputationMaxCap1
Definition: ObjectMgr.h:571
float RepValue1
Definition: ObjectMgr.h:572
uint32 RepFaction1
Definition: ObjectMgr.h:569
uint32 RepFaction2
Definition: ObjectMgr.h:570
bool TeamDependent
Definition: ObjectMgr.h:577
float RepValue2
Definition: ObjectMgr.h:574
uint32 ReputationMaxCap2
Definition: ObjectMgr.h:573
bool IsNonRaidDungeon() const
Definition: Map.h:296
Definition: DBCStructure.h:1246

References CalculateReputationGain(), CreatureTemplate::Entry, GetChampioningFaction(), Creature::GetCreatureTemplate(), Map::GetDifficulty(), Map::GetId(), Unit::GetLevel(), GetLFGDungeon(), WorldObject::GetMap(), GetReputationMgr(), GetTeamId(), Map::IsNonRaidDungeon(), Object::IsPlayer(), Creature::IsReputationRewardDisabled(), ReputationMgr::ModifyReputation(), ReputationOnKillEntry::RepFaction1, ReputationOnKillEntry::RepFaction2, REPUTATION_SOURCE_KILL, ReputationOnKillEntry::ReputationMaxCap1, ReputationOnKillEntry::ReputationMaxCap2, ReputationOnKillEntry::RepValue1, ReputationOnKillEntry::RepValue2, sFactionStore, sObjectMgr, TEAM_ALLIANCE, TEAM_HORDE, ReputationOnKillEntry::TeamDependent, and Object::ToCreature().

Referenced by KillRewarder::_RewardReputation(), and RewardQuest().

◆ Satisfy()

bool Player::Satisfy ( DungeonProgressionRequirements const *  ar,
uint32  target_map,
bool  report = false 
)
6707{
6708 if (!IsGameMaster() && ar)
6709 {
6710 uint8 LevelMin = 0;
6711 uint8 LevelMax = 0;
6712
6713 MapEntry const* mapEntry = sMapStore.LookupEntry(target_map);
6714 if (!mapEntry)
6715 return false;
6716
6717 if (!sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_LEVEL))
6718 {
6719 if (ar->levelMin && GetLevel() < ar->levelMin)
6720 LevelMin = ar->levelMin;
6721 if (ar->levelMax && GetLevel() > ar->levelMax)
6722 LevelMax = ar->levelMax;
6723 }
6724
6725 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, target_map, this))
6726 {
6728 return false;
6729 }
6730
6731 Player* partyLeader = this;
6732 std::string leaderName = m_session->GetAcoreString(LANG_YOU);
6733 {
6734 ObjectGuid leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID();
6735 Player* tempLeader = HashMapHolder<Player>::Find(leaderGuid);
6736 if (leaderGuid != GetGUID())
6737 {
6738 if (tempLeader != nullptr)
6739 {
6740 partyLeader = tempLeader;
6741 }
6742 leaderName = GetGroup()->GetLeaderName();
6743 }
6744 }
6745
6746 //Check all items
6747 std::vector<const ProgressionRequirement*> missingPlayerItems;
6748 std::vector<const ProgressionRequirement*> missingLeaderItems;
6749 for (const ProgressionRequirement* itemRequirement : ar->items)
6750 {
6751 Player* checkPlayer = this;
6752 std::vector<const ProgressionRequirement*>* missingItems = &missingPlayerItems;
6753 if (itemRequirement->checkLeaderOnly)
6754 {
6755 checkPlayer = partyLeader;
6756 missingItems = &missingLeaderItems;
6757 }
6758
6759 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == checkPlayer->GetTeamId(true))
6760 {
6761 if (!checkPlayer->HasItemCount(itemRequirement->id, 1))
6762 {
6763 missingItems->push_back(itemRequirement);
6764 }
6765 }
6766 }
6767
6768 //Check all achievements
6769 std::vector<const ProgressionRequirement*> missingPlayerAchievements;
6770 std::vector<const ProgressionRequirement*> missingLeaderAchievements;
6771 for (const ProgressionRequirement* achievementRequirement : ar->achievements)
6772 {
6773 Player* checkPlayer = this;
6774 std::vector<const ProgressionRequirement*>* missingAchievements = &missingPlayerAchievements;
6775 if (achievementRequirement->checkLeaderOnly)
6776 {
6777 checkPlayer = partyLeader;
6778 missingAchievements = &missingLeaderAchievements;
6779 }
6780
6781 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == GetTeamId(true))
6782 {
6783 if (!checkPlayer || !checkPlayer->HasAchieved(achievementRequirement->id))
6784 {
6785 missingAchievements->push_back(achievementRequirement);
6786 }
6787 }
6788 }
6789
6790 //Check all quests
6791 std::vector<const ProgressionRequirement*> missingPlayerQuests;
6792 std::vector<const ProgressionRequirement*> missingLeaderQuests;
6793 for (const ProgressionRequirement* questRequirement : ar->quests)
6794 {
6795 Player* checkPlayer = this;
6796 std::vector<const ProgressionRequirement*>* missingQuests = &missingPlayerQuests;
6797 if (questRequirement->checkLeaderOnly)
6798 {
6799 checkPlayer = partyLeader;
6800 missingQuests = &missingLeaderQuests;
6801 }
6802
6803 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == checkPlayer->GetTeamId(true))
6804 {
6805 if (!checkPlayer->GetQuestRewardStatus(questRequirement->id))
6806 {
6807 missingQuests->push_back(questRequirement);
6808 }
6809 }
6810 }
6811
6812 //Check if avg ILVL requirement is allowed
6813 bool ilvlRequirementNotMet = false;
6815 {
6816 const int32 currentIlvl = (int32)GetAverageItemLevelForDF();
6817 if (ar->reqItemLevel > currentIlvl)
6818 {
6819 ilvlRequirementNotMet = true;
6820 }
6821 }
6822
6823 Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid());
6824 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
6825 if (LevelMin || LevelMax || ilvlRequirementNotMet
6826 || missingPlayerItems.size() || missingPlayerQuests.size() || missingPlayerAchievements.size()
6827 || missingLeaderItems.size() || missingLeaderQuests.size() || missingLeaderAchievements.size())
6828 {
6829 if (!sScriptMgr->OnPlayerNotAvoidSatisfy(partyLeader, ar, target_map, report))
6830 return true;
6831
6832 if (report)
6833 {
6834 uint8 requirementPrintMode = sWorld->getIntConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE);
6835
6836 if (requirementPrintMode == 0)
6837 {
6838 //Just print out the requirements are not met
6840 }
6841 else if (requirementPrintMode == 1)
6842 {
6843 //Blizzlike method of printing out the requirements
6844 if (missingPlayerQuests.size() && !missingPlayerQuests[0]->note.empty())
6845 {
6846 ChatHandler(GetSession()).PSendSysMessage("{}", missingPlayerQuests[0]->note);
6847 }
6848 else if (missingLeaderQuests.size() && !missingLeaderQuests[0]->note.empty())
6849 {
6850 ChatHandler(GetSession()).PSendSysMessage("{}", missingLeaderQuests[0]->note);
6851 }
6852 else if (mapDiff->hasErrorMessage)
6853 {
6854 // if (missingAchievement) covered by this case
6855 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6856 }
6857 else if (missingPlayerItems.size())
6858 {
6860 std::string name = sObjectMgr->GetItemTemplate(missingPlayerItems[0]->id)->Name1;
6861 if (ItemLocale const* il = sObjectMgr->GetItemLocale(missingPlayerItems[0]->id))
6862 {
6863 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6864 }
6866 }
6867 else if (LevelMin)
6868 {
6870 }
6871 else if (ilvlRequirementNotMet)
6872 {
6874 }
6875 }
6876 else
6877 {
6878 bool errorAlreadyPrinted = false;
6879 //Pretty way of printing out requirements
6880 if (missingPlayerQuests.size())
6881 {
6883 PrettyPrintRequirementsQuestList(missingPlayerQuests);
6884 errorAlreadyPrinted = true;
6885 }
6886 if (missingLeaderQuests.size())
6887 {
6889 PrettyPrintRequirementsQuestList(missingLeaderQuests);
6890 errorAlreadyPrinted = true;
6891 }
6892
6893 if (missingPlayerAchievements.size())
6894 {
6896 PrettyPrintRequirementsAchievementsList(missingPlayerAchievements);
6897 errorAlreadyPrinted = true;
6898 }
6899 if (missingLeaderAchievements.size())
6900 {
6902 PrettyPrintRequirementsAchievementsList(missingLeaderAchievements);
6903 errorAlreadyPrinted = true;
6904 }
6905
6906 if (missingPlayerItems.size())
6907 {
6909 PrettyPrintRequirementsItemsList(missingPlayerItems);
6910 errorAlreadyPrinted = true;
6911 }
6912
6913 if (missingLeaderItems.size())
6914 {
6916 PrettyPrintRequirementsItemsList(missingLeaderItems);
6917 errorAlreadyPrinted = true;
6918 }
6919
6920 if (ilvlRequirementNotMet)
6921 {
6923 }
6924
6925 if (LevelMin)
6926 {
6928 }
6929 else if (LevelMax)
6930 {
6932 }
6933 else if (mapDiff->hasErrorMessage && !errorAlreadyPrinted)
6934 {
6935 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6936 }
6937 }
6938
6939 //Print the extra string
6941 if (optionalStringID > 0)
6942 {
6943 ChatHandler(GetSession()).SendSysMessage(optionalStringID);
6944 }
6945 }
6946 return false;
6947 }
6948 }
6949 return true;
6950}
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition: DBCStores.cpp:767
@ LANG_INSTANCE_CLOSED
Definition: Language.h:1055
@ LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS
Definition: Language.h:852
@ LANG_YOU
Definition: Language.h:76
@ LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET
Definition: Language.h:848
@ LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS
Definition: Language.h:845
@ LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS
Definition: Language.h:843
@ LANG_ACCESS_REQUIREMENT_NOT_MET
Definition: Language.h:847
@ LANG_LEVEL_MINREQUIRED_AND_ITEM
Definition: Language.h:82
@ LANG_ACCESS_REQUIREMENT_MAX_LEVEL
Definition: Language.h:849
@ LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS
Definition: Language.h:844
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS
Definition: Language.h:850
@ LANG_LEVEL_MINREQUIRED
Definition: Language.h:81
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS
Definition: Language.h:851
@ TRANSFER_ABORT_DIFFICULTY
Definition: Player.h:796
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID
Definition: IWorld.h:406
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE
Definition: IWorld.h:405
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL
Definition: IWorld.h:162
@ CONFIG_INSTANCE_IGNORE_LEVEL
Definition: IWorld.h:82
@ DISABLE_TYPE_MAP
Definition: DisableMgr.h:30
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:160
TeamId faction
Definition: Player.h:941
uint32 id
Definition: Player.h:940
bool checkLeaderOnly
Definition: Player.h:944
float GetAverageItemLevelForDF()
Definition: Player.cpp:15685
void PrettyPrintRequirementsQuestList(const std::vector< const ProgressionRequirement * > &missingQuests) const
Definition: PlayerStorage.cpp:6598
void PrettyPrintRequirementsItemsList(const std::vector< const ProgressionRequirement * > &missingItems) const
Definition: PlayerStorage.cpp:6668
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition: Player.cpp:11665
void PrettyPrintRequirementsAchievementsList(const std::vector< const ProgressionRequirement * > &missingAchievements) const
Definition: PlayerStorage.cpp:6635
const char * GetLeaderName() const
Definition: Group.cpp:2310
ObjectGuid GetLeaderGUID() const
Definition: Group.cpp:2295
void SendAreaTriggerMessage(std::string_view str)
Definition: WorldSession.cpp:206
Definition: DBCStructure.h:2223
bool hasErrorMessage
Definition: DBCStructure.h:2229

References DungeonProgressionRequirements::achievements, ProgressionRequirement::checkLeaderOnly, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE, CONFIG_INSTANCE_IGNORE_LEVEL, DISABLE_TYPE_MAP, ProgressionRequirement::faction, HashMapHolder< T >::Find(), WorldSession::GetAcoreString(), GetAverageItemLevelForDF(), GetDifficulty(), GetDownscaledMapDifficultyData(), GetGroup(), Object::GetGUID(), Group::GetLeaderGUID(), Group::GetLeaderName(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), GetQuestRewardStatus(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetTeamId(), HasAchieved(), MapDifficulty::hasErrorMessage, HasItemCount(), ProgressionRequirement::id, IsGameMaster(), MapEntry::IsRaid(), DungeonProgressionRequirements::items, LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET, LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS, LANG_ACCESS_REQUIREMENT_MAX_LEVEL, LANG_ACCESS_REQUIREMENT_NOT_MET, LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS, LANG_INSTANCE_CLOSED, LANG_LEVEL_MINREQUIRED, LANG_LEVEL_MINREQUIRED_AND_ITEM, LANG_YOU, DungeonProgressionRequirements::levelMax, DungeonProgressionRequirements::levelMin, m_session, PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ChatHandler::PSendSysMessage(), DungeonProgressionRequirements::quests, DungeonProgressionRequirements::reqItemLevel, sDisableMgr, WorldSession::SendAreaTriggerMessage(), ChatHandler::SendSysMessage(), SendTransferAborted(), sMapStore, sObjectMgr, sScriptMgr, sWorld, TEAM_NEUTRAL, and TRANSFER_ABORT_DIFFICULTY.

Referenced by Spell::CheckCast(), WorldSession::HandleSetRaidDifficultyOpcode(), and MapMgr::PlayerCannotEnter().

◆ SatisfyQuestClass()

bool Player::SatisfyQuestClass ( Quest const *  qInfo,
bool  msg 
) const
1086{
1087 uint32 reqClass = qInfo->GetRequiredClasses();
1088
1089 if (reqClass == 0)
1090 return true;
1091
1092 if ((reqClass & getClassMask()) == 0)
1093 {
1094 if (msg)
1096
1097 return false;
1098 }
1099
1100 return true;
1101}
@ INVALIDREASON_DONT_HAVE_REQ
Definition: QuestDef.h:48
void SendCanTakeQuestResponse(uint32 msg) const
Definition: PlayerQuest.cpp:2405

References Unit::getClassMask(), Quest::GetRequiredClasses(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestConditions()

bool Player::SatisfyQuestConditions ( Quest const *  qInfo,
bool  msg 
)
1160{
1161 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, qInfo->GetQuestId());
1162 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1163 {
1164 if (msg)
1166 LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest {}", qInfo->GetQuestId());
1167 return false;
1168 }
1169 return true;
1170}

References CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, Quest::GetQuestId(), INVALIDREASON_DONT_HAVE_REQ, LOG_DEBUG, sConditionMgr, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestDay()

bool Player::SatisfyQuestDay ( Quest const *  qInfo,
bool  msg 
) const
1269{
1270 if (!qInfo->IsDaily() && !qInfo->IsDFQuest())
1271 return true;
1272
1273 if (qInfo->IsDFQuest())
1274 {
1275 if (!m_DFQuests.empty())
1276 return false;
1277
1278 return true;
1279 }
1280
1281 bool have_slot = false;
1282 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
1283 {
1284 uint32 id = GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx);
1285 if (qInfo->GetQuestId() == id)
1286 return false;
1287
1288 if (!id)
1289 have_slot = true;
1290 }
1291
1292 if (!have_slot)
1293 {
1294 if (msg)
1296 return false;
1297 }
1298
1299 return true;
1300}
@ INVALIDREASON_DAILY_QUESTS_REMAINING
Definition: QuestDef.h:58

References Quest::GetQuestId(), Object::GetUInt32Value(), INVALIDREASON_DAILY_QUESTS_REMAINING, Quest::IsDaily(), Quest::IsDFQuest(), m_DFQuests, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and SendCanTakeQuestResponse().

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SatisfyQuestExclusiveGroup()

bool Player::SatisfyQuestExclusiveGroup ( Quest const *  qInfo,
bool  msg 
) const
1184{
1185 // non positive exclusive group, if > 0 then can be start if any other quest in exclusive group already started/completed
1186 if (qInfo->GetExclusiveGroup() <= 0)
1187 return true;
1188
1189 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qInfo->GetExclusiveGroup()));
1190
1191 for (; range.first != range.second; ++range.first)
1192 {
1193 uint32 exclude_Id = range.first->second;
1194
1195 // skip checked quest id, only state of other quests in group is interesting
1196 if (exclude_Id == qInfo->GetQuestId())
1197 continue;
1198
1199 // not allow have daily quest if daily quest from exclusive group already recently completed
1200 Quest const* Nquest = sObjectMgr->GetQuestTemplate(exclude_Id);
1201 if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest, false))
1202 {
1203 if (msg)
1205
1206 return false;
1207 }
1208
1209 // alternative quest already started or completed - but don't check rewarded states if both are repeatable
1210 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && !Nquest->IsSeasonal() && IsQuestRewarded(exclude_Id))) // pussywizard: added !Nquest->IsSeasonal() because seasonal quests are considered rewarded only if finished this year, this is checked above in SatisfyQuestSeasonal
1211 {
1212 if (msg)
1214 return false;
1215 }
1216 }
1217 return true;
1218}
std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
Definition: ObjectMgr.h:1144

References Quest::GetExclusiveGroup(), Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QUEST_STATUS_NONE, SatisfyQuestDay(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestLevel()

bool Player::SatisfyQuestLevel ( Quest const *  qInfo,
bool  msg 
) const
968{
969 if (GetLevel() < qInfo->GetMinLevel())
970 {
971 if (msg)
973 return false;
974 }
975 else if (qInfo->GetMaxLevel() > 0 && GetLevel() > qInfo->GetMaxLevel())
976 {
977 if (msg)
978 SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level
979 return false;
980 }
981 return true;
982}
@ INVALIDREASON_QUEST_FAILED_LOW_LEVEL
Definition: QuestDef.h:49

References Unit::GetLevel(), Quest::GetMaxLevel(), Quest::GetMinLevel(), INVALIDREASON_DONT_HAVE_REQ, INVALIDREASON_QUEST_FAILED_LOW_LEVEL, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), npc_wg_quest_giver::GetDialogStatus(), and GetQuestDialogStatus().

◆ SatisfyQuestLog()

bool Player::SatisfyQuestLog ( bool  msg)
985{
986 // exist free slot
988 return true;
989
990 if (msg)
991 {
993 GetSession()->SendPacket(&data);
994 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL");
995 }
996 return false;
997}
@ SMSG_QUESTLOG_FULL
Definition: Opcodes.h:435

References FindQuestSlot(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, WorldSession::SendPacket(), and SMSG_QUESTLOG_FULL.

Referenced by CanAddQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestMonth()

bool Player::SatisfyQuestMonth ( Quest const *  qInfo,
bool  msg 
) const
1327{
1328 if (!qInfo->IsMonthly() || m_monthlyquests.empty())
1329 return true;
1330
1331 // if not found in cooldown list
1332 return m_monthlyquests.find(qInfo->GetQuestId()) == m_monthlyquests.end();
1333}

References Quest::GetQuestId(), Quest::IsMonthly(), and m_monthlyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestNextChain()

bool Player::SatisfyQuestNextChain ( Quest const *  qInfo,
bool  msg 
) const
1221{
1222 uint32 nextQuest = qInfo->GetNextQuestInChain();
1223 if (!nextQuest)
1224 return true;
1225
1226 // next quest in chain already started or completed
1227 if (GetQuestStatus(nextQuest) != QUEST_STATUS_NONE) // GetQuestStatus returns QUEST_STATUS_COMPLETED for rewarded quests
1228 {
1229 if (msg)
1231 return false;
1232 }
1233
1234 // check for all quests further up the chain
1235 // only necessary if there are quest chains with more than one quest that can be skipped
1236 //return SatisfyQuestNextChain(qInfo->GetNextQuestInChain(), msg);
1237 return true;
1238}

References Quest::GetNextQuestInChain(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPrevChain()

bool Player::SatisfyQuestPrevChain ( Quest const *  qInfo,
bool  msg 
) const
1241{
1242 // No previous quest in chain
1243 if (qInfo->prevChainQuests.empty())
1244 return true;
1245
1246 for (Quest::PrevChainQuests::const_iterator iter = qInfo->prevChainQuests.begin(); iter != qInfo->prevChainQuests.end(); ++iter)
1247 {
1248 QuestStatusMap::const_iterator itr = m_QuestStatus.find(*iter);
1249
1250 // If any of the previous quests in chain active, return false
1251 if (itr != m_QuestStatus.end() && itr->second.Status != QUEST_STATUS_NONE)
1252 {
1253 if (msg)
1255 return false;
1256 }
1257
1258 // check for all quests further down the chain
1259 // only necessary if there are quest chains with more than one quest that can be skipped
1260 //if (!SatisfyQuestPrevChain(prevId, msg))
1261 // return false;
1262 }
1263
1264 // No previous quest in chain active
1265 return true;
1266}

References INVALIDREASON_DONT_HAVE_REQ, m_QuestStatus, Quest::prevChainQuests, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPreviousQuest()

bool Player::SatisfyQuestPreviousQuest ( Quest const *  qInfo,
bool  msg 
) const
1000{
1001 // No previous quest (might be first quest in a series)
1002 if (qInfo->prevQuests.empty())
1003 return true;
1004
1005 for (Quest::PrevQuests::const_iterator iter = qInfo->prevQuests.begin(); iter != qInfo->prevQuests.end(); ++iter)
1006 {
1007 uint32 prevId = std::abs(*iter);
1008
1009 Quest const* qPrevInfo = sObjectMgr->GetQuestTemplate(prevId);
1010
1011 if (qPrevInfo)
1012 {
1013 // If any of the positive previous quests completed, return true
1014 if (*iter > 0 && IsQuestRewarded(prevId) && (!qPrevInfo->IsSeasonal() || !SatisfyQuestSeasonal(qPrevInfo, false)))
1015 {
1016 // skip one-from-all exclusive group
1017 if (qPrevInfo->GetExclusiveGroup() >= 0)
1018 return true;
1019
1020 // each-from-all exclusive group (< 0)
1021 // can be start if only all quests in prev quest exclusive group completed and rewarded
1022 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1023
1024 for (; range.first != range.second; ++range.first)
1025 {
1026 uint32 exclude_Id = range.first->second;
1027
1028 // skip checked quest id, only state of other quests in group is interesting
1029 if (exclude_Id == prevId)
1030 continue;
1031
1032 // alternative quest from group also must be completed and rewarded(reported)
1033
1034 Quest const* qExcludeInfo = sObjectMgr->GetQuestTemplate(exclude_Id);
1035 if (!IsQuestRewarded(exclude_Id) || (qExcludeInfo->IsSeasonal() && SatisfyQuestSeasonal(qExcludeInfo, false)))
1036 {
1037 if (msg)
1039 return false;
1040 }
1041 }
1042 return true;
1043 }
1044
1045 // If any of the negative previous quests active, return true
1046 if (*iter < 0 && GetQuestStatus(prevId) != QUEST_STATUS_NONE)
1047 {
1048 // skip one-from-all exclusive group
1049 if (qPrevInfo->GetExclusiveGroup() >= 0)
1050 return true;
1051
1052 // each-from-all exclusive group (< 0)
1053 // can be start if only all quests in prev quest exclusive group active
1054 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1055
1056 for (; range.first != range.second; ++range.first)
1057 {
1058 uint32 exclude_Id = range.first->second;
1059
1060 // skip checked quest id, only state of other quests in group is interesting
1061 if (exclude_Id == prevId)
1062 continue;
1063
1064 // alternative quest from group also must be active
1065 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE)
1066 {
1067 if (msg)
1069 return false;
1070 }
1071 }
1072 return true;
1073 }
1074 }
1075 }
1076
1077 // Has only positive prev. quests in non-rewarded state
1078 // and negative prev. quests in non-active state
1079 if (msg)
1081
1082 return false;
1083}
int32 GetExclusiveGroup() const
Definition: QuestDef.h:251

References Quest::GetExclusiveGroup(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsSeasonal(), Quest::prevQuests, QUEST_STATUS_NONE, SatisfyQuestSeasonal(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestRace()

bool Player::SatisfyQuestRace ( Quest const *  qInfo,
bool  msg 
) const
1104{
1105 uint32 reqraces = qInfo->GetAllowableRaces();
1106 if (reqraces == 0)
1107 return true;
1108 if ((reqraces & getRaceMask()) == 0)
1109 {
1110 if (msg)
1112 return false;
1113 }
1114 return true;
1115}
@ INVALIDREASON_QUEST_FAILED_WRONG_RACE
Definition: QuestDef.h:50

References Quest::GetAllowableRaces(), Unit::getRaceMask(), INVALIDREASON_QUEST_FAILED_WRONG_RACE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestReputation()

bool Player::SatisfyQuestReputation ( Quest const *  qInfo,
bool  msg 
) const
1118{
1119 uint32 fIdMin = qInfo->GetRequiredMinRepFaction(); //Min required rep
1120 if (fIdMin && GetReputationMgr().GetReputation(fIdMin) < qInfo->GetRequiredMinRepValue())
1121 {
1122 if (msg)
1124 return false;
1125 }
1126
1127 uint32 fIdMax = qInfo->GetRequiredMaxRepFaction(); //Max required rep
1128 if (fIdMax && GetReputationMgr().GetReputation(fIdMax) >= qInfo->GetRequiredMaxRepValue())
1129 {
1130 if (msg)
1132 return false;
1133 }
1134
1135 // ReputationObjective2 does not seem to be an objective requirement but a requirement
1136 // to be able to accept the quest
1137 uint32 fIdObj = qInfo->GetRepObjectiveFaction2();
1138 if (fIdObj && GetReputationMgr().GetReputation(fIdObj) >= qInfo->GetRepObjectiveValue2())
1139 {
1140 if (msg)
1142 return false;
1143 }
1144
1145 return true;
1146}

References Quest::GetRepObjectiveFaction2(), Quest::GetRepObjectiveValue2(), GetReputation(), GetReputationMgr(), Quest::GetRequiredMaxRepFaction(), Quest::GetRequiredMaxRepValue(), Quest::GetRequiredMinRepFaction(), Quest::GetRequiredMinRepValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestSeasonal()

bool Player::SatisfyQuestSeasonal ( Quest const *  qInfo,
bool  msg 
) const
1312{
1313 if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
1314 return true;
1315
1316 // cppcheck-suppress mismatchingContainers
1317 Player::SeasonalEventQuestMap::iterator itr = ((Player*)this)->m_seasonalquests.find(qInfo->GetEventIdForQuest());
1318
1319 if (itr == m_seasonalquests.end() || itr->second.empty())
1320 return true;
1321
1322 // if not found in cooldown list
1323 return itr->second.find(qInfo->GetQuestId()) == itr->second.end();
1324}

References Quest::GetEventIdForQuest(), Quest::GetQuestId(), Quest::IsSeasonal(), and m_seasonalquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), GetQuestRewardStatus(), GetQuestStatus(), SatisfyQuestExclusiveGroup(), and SatisfyQuestPreviousQuest().

◆ SatisfyQuestSkill()

bool Player::SatisfyQuestSkill ( Quest const *  qInfo,
bool  msg 
) const
948{
949 uint32 skill = qInfo->GetRequiredSkill();
950
951 // skip 0 case RequiredSkill
952 if (skill == 0)
953 return true;
954
955 // check skill value
956 if (GetBaseSkillValue(skill) < qInfo->GetRequiredSkillValue())
957 {
958 if (msg)
960
961 return false;
962 }
963
964 return true;
965}

References GetBaseSkillValue(), Quest::GetRequiredSkill(), Quest::GetRequiredSkillValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestStatus()

bool Player::SatisfyQuestStatus ( Quest const *  qInfo,
bool  msg 
) const
1149{
1150 if (GetQuestStatus(qInfo->GetQuestId()) != QUEST_STATUS_NONE)
1151 {
1152 if (msg)
1154 return false;
1155 }
1156 return true;
1157}
@ INVALIDREASON_QUEST_ALREADY_ON
Definition: QuestDef.h:53

References Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_QUEST_ALREADY_ON, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestTimed()

bool Player::SatisfyQuestTimed ( Quest const *  qInfo,
bool  msg 
) const
1173{
1174 if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
1175 {
1176 if (msg)
1178 return false;
1179 }
1180 return true;
1181}
@ INVALIDREASON_QUEST_ONLY_ONE_TIMED
Definition: QuestDef.h:52

References Quest::HasSpecialFlag(), INVALIDREASON_QUEST_ONLY_ONE_TIMED, m_timedquests, QUEST_SPECIAL_FLAGS_TIMED, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestWeek()

bool Player::SatisfyQuestWeek ( Quest const *  qInfo,
bool  msg 
) const
1303{
1304 if (!qInfo->IsWeekly() || m_weeklyquests.empty())
1305 return true;
1306
1307 // if not found in cooldown list
1308 return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
1309}

References Quest::GetQuestId(), Quest::IsWeekly(), and m_weeklyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SaveGoldToDB()

void Player::SaveGoldToDB ( CharacterDatabaseTransaction  trans)
7128{
7130 stmt->SetData(0, GetMoney());
7131 stmt->SetData(1, GetGUID().GetCounter());
7132 trans->Append(stmt);
7133}
@ CHAR_UDP_CHAR_MONEY
Definition: CharacterDatabase.h:429

References CHAR_UDP_CHAR_MONEY, CharacterDatabase, Object::GetGUID(), GetMoney(), and PreparedStatementBase::SetData().

Referenced by WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), and SaveInventoryAndGoldToDB().

◆ SaveHealthBeforeDuel()

void Player::SaveHealthBeforeDuel ( )
inline

◆ SaveInventoryAndGoldToDB()

void Player::SaveInventoryAndGoldToDB ( CharacterDatabaseTransaction  trans)
7122{
7123 _SaveInventory(trans);
7124 SaveGoldToDB(trans);
7125}
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7127
void _SaveInventory(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7241

References _SaveInventory(), and SaveGoldToDB().

Referenced by WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleMailTakeItem(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSendMail(), WorldSession::HandleWrapItemOpcode(), and RefundItem().

◆ SaveManaBeforeDuel()

void Player::SaveManaBeforeDuel ( )
inline

◆ SavePositionInDB() [1/2]

void Player::SavePositionInDB ( uint32  mapid,
float  x,
float  y,
float  z,
float  o,
uint32  zone,
ObjectGuid  guid 
)
static

◆ SavePositionInDB() [2/2]

void Player::SavePositionInDB ( WorldLocation const &  loc,
uint16  zoneId,
ObjectGuid  guid,
CharacterDatabaseTransaction  trans 
)
static
100{
102
103 stmt->SetData(0, loc.GetPositionX());
104 stmt->SetData(1, loc.GetPositionY());
105 stmt->SetData(2, loc.GetPositionZ());
106 stmt->SetData(3, loc.GetOrientation());
107 stmt->SetData(4, uint16(loc.GetMapId()));
108 stmt->SetData(5, zoneId);
109 stmt->SetData(6, guid.GetCounter());
110
111 CharacterDatabase.ExecuteOrAppend(trans, stmt);
112}

References CHAR_UPD_CHARACTER_POSITION, CharacterDatabase, ObjectGuid::GetCounter(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and PreparedStatementBase::SetData().

◆ SaveRecallPosition()

◆ SaveToDB() [1/2]

◆ SaveToDB() [2/2]

void Player::SaveToDB ( CharacterDatabaseTransaction  trans,
bool  create,
bool  logout 
)
7060{
7061 // delay auto save at any saves (manual, in code, or autosave)
7062 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
7063
7064 //lets allow only players in world to be saved
7066 {
7068 return;
7069 }
7070
7071 // pussywizard: full save now, so clear partial additional saves
7074
7075 // first save/honor gain after midnight will also update the player's honor fields
7077
7078 LOG_DEBUG("entities.unit", "The value of player {} at save: ", m_name);
7080
7081 if (!create)
7082 sScriptMgr->OnPlayerSave(this);
7083
7084 _SaveCharacter(create, trans);
7085
7086 if (m_mailsUpdated) //save mails only when needed
7087 _SaveMail(trans);
7088
7089 _SaveEntryPoint(trans);
7090 _SaveInventory(trans);
7091 _SaveQuestStatus(trans);
7092 _SaveDailyQuestStatus(trans);
7096 _SaveTalents(trans);
7097 _SaveSpells(trans);
7098 _SaveSpellCooldowns(trans, logout);
7099 _SaveActions(trans);
7100 _SaveAuras(trans, logout);
7101 _SaveSkills(trans);
7102 m_achievementMgr->SaveToDB(trans);
7103 m_reputationMgr->SaveToDB(trans);
7104 _SaveEquipmentSets(trans);
7105 GetSession()->SaveTutorialsData(trans); // changed only while character in game
7106 _SaveGlyphs(trans);
7108 _SavePlayerSettings(trans);
7109
7110 // check if stats should only be saved on logout
7111 // save stats can be out of transaction
7113 _SaveStats(trans);
7114
7115 // save pet (hunter pet level and experience and all type pets health/mana).
7116 if (Pet* pet = GetPet())
7117 pet->SavePetToDB(PET_SAVE_AS_CURRENT);
7118}
@ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT
Definition: IWorld.h:68
void SaveToDB(CharacterDatabaseTransaction trans)
Definition: AchievementMgr.cpp:562
bool IsBeingTeleportedFar() const
Definition: Player.h:2102
void _SaveMonthlyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7616
void _SaveTalents(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14966
void _SaveDailyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7521
void _SaveSpells(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7694
void _SaveCharacter(bool create, CharacterDatabaseTransaction trans)
Definition: Player.cpp:14623
void _SaveSkills(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7638
void _SaveEquipmentSets(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14489
void _SaveGlyphs(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14922
void _SaveMail(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7379
void _SaveQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7454
void _SaveAuras(CharacterDatabaseTransaction trans, bool logout)
Definition: PlayerStorage.cpp:7183
void _SaveSeasonalQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7582
void _SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans)
Definition: Player.cpp:15812
void _SavePlayerSettings(CharacterDatabaseTransaction trans)
Definition: PlayerSettings.cpp:91
void _SaveWeeklyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7559
void _SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout)
Definition: Player.cpp:3623
void _SaveEntryPoint(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14540
void _SaveStats(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7741
void SaveToDB(CharacterDatabaseTransaction trans)
Definition: ReputationMgr.cpp:625
bool isLogingOut() const
Is the user engaged in a log out process?
Definition: WorldSession.h:399
void SaveTutorialsData(CharacterDatabaseTransaction trans)
Definition: WorldSession.cpp:954

References _SaveActions(), _SaveAuras(), _SaveCharacter(), _SaveDailyQuestStatus(), _SaveEntryPoint(), _SaveEquipmentSets(), _SaveGlyphs(), _SaveInstanceTimeRestrictions(), _SaveInventory(), _SaveMail(), _SaveMonthlyQuestStatus(), _SavePlayerSettings(), _SaveQuestStatus(), _SaveSeasonalQuestStatus(), _SaveSkills(), _SaveSpellCooldowns(), _SaveSpells(), _SaveStats(), _SaveTalents(), _SaveWeeklyQuestStatus(), CONFIG_INTERVAL_SAVE, CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, DELAYED_SAVE_PLAYER, GetPet(), GetSession(), IsBeingTeleportedFar(), WorldSession::isLogingOut(), LOG_DEBUG, m_achievementMgr, m_additionalSaveMask, m_additionalSaveTimer, m_mailsUpdated, WorldObject::m_name, m_nextSave, m_reputationMgr, m_session, outDebugValues(), PET_SAVE_AS_CURRENT, AchievementMgr::SaveToDB(), ReputationMgr::SaveToDB(), WorldSession::SaveTutorialsData(), ScheduleDelayedOperation(), sScriptMgr, sWorld, and UpdateHonorFields().

◆ Say() [1/2]

void Player::Say ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles said message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9351{
9352 std::string _text(text);
9353 if (!sScriptMgr->OnPlayerCanUseChat(this, CHAT_MSG_SAY, language, _text))
9354 {
9355 return;
9356 }
9357
9358 sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text);
9359
9360 WorldPacket data;
9361 ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text);
9362 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true, false, false, true);
9363}
@ CONFIG_LISTEN_RANGE_SAY
Definition: IWorld.h:192
@ CHAT_MSG_SAY
Definition: SharedDefines.h:3153
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition: Chat.cpp:265
void SendMessageToSetInRange(WorldPacket const *data, float dist, bool self) const override
Definition: Player.cpp:5682

References ChatHandler::BuildChatPacket(), CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by Unit::HandleDummyAuraProc(), WorldSession::HandleMessagechatOpcode(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and boss_headless_horseman::UpdateAI().

◆ Say() [2/2]

void Player::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9366{
9367 Talk(textId, CHAT_MSG_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
9368}
Talk
Definition: hyjal.cpp:82

References CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ ScheduleDelayedOperation()

void Player::ScheduleDelayedOperation ( uint32  operation)
inline
2110 {
2111 if (operation < DELAYED_END)
2112 m_DelayedOperations |= operation;
2113 }
@ DELAYED_END
Definition: Player.h:916

References DELAYED_END, and m_DelayedOperations.

Referenced by Battleground::RemovePlayerAtLeave(), ResurectUsingRequestData(), SaveToDB(), and TeleportToEntryPoint().

◆ SendActionButtons()

void Player::SendActionButtons ( uint32  state) const
5560{
5561 LOG_DEBUG("entities.player", "Sending Action Buttons for {} spec {}", GetGUID().ToString(), m_activeSpec);
5562
5564 data << uint8(state);
5565 /*
5566 state can be 0, 1, 2
5567 0 - Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties
5568 1 - Used in any SMSG_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail.
5569 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
5570 */
5571 if (state != 2)
5572 {
5573 for (uint8 button = 0; button < MAX_ACTION_BUTTONS; ++button)
5574 {
5575 ActionButtonList::const_iterator itr = m_actionButtons.find(button);
5576 if (itr != m_actionButtons.end() && itr->second.uState != ACTIONBUTTON_DELETED)
5577 data << uint32(itr->second.packedData);
5578 else
5579 data << uint32(0);
5580 }
5581 }
5582
5583 GetSession()->SendPacket(&data);
5584 LOG_DEBUG("entities.player", "Action Buttons for {} spec {} Sent", GetGUID().ToString(), m_activeSpec);
5585}
@ SMSG_ACTION_BUTTONS
Definition: Opcodes.h:327

References ACTIONBUTTON_DELETED, Object::GetGUID(), GetSession(), LOG_DEBUG, m_actionButtons, m_activeSpec, MAX_ACTION_BUTTONS, WorldSession::SendPacket(), SMSG_ACTION_BUTTONS, and Position::ToString().

Referenced by ActivateSpec(), WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and SendInitialActionButtons().

◆ SendAttackSwingBadFacingAttack()

void Player::SendAttackSwingBadFacingAttack ( )
147{
149 GetSession()->SendPacket(&data);
150}
@ SMSG_ATTACKSWING_BADFACING
Definition: Opcodes.h:356

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_BADFACING.

Referenced by Update().

◆ SendAttackSwingCancelAttack()

◆ SendAttackSwingCantAttack()

void Player::SendAttackSwingCantAttack ( )
135{
137 GetSession()->SendPacket(&data);
138}
@ SMSG_ATTACKSWING_CANT_ATTACK
Definition: Opcodes.h:359

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_CANT_ATTACK.

◆ SendAttackSwingDeadTarget()

void Player::SendAttackSwingDeadTarget ( )
129{
131 GetSession()->SendPacket(&data);
132}
@ SMSG_ATTACKSWING_DEADTARGET
Definition: Opcodes.h:358

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_DEADTARGET.

◆ SendAttackSwingNotInRange()

void Player::SendAttackSwingNotInRange ( )
79{
81 GetSession()->SendPacket(&data);
82}
@ SMSG_ATTACKSWING_NOTINRANGE
Definition: Opcodes.h:355

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_NOTINRANGE.

Referenced by Update().

◆ SendAutoRepeatCancel()

void Player::SendAutoRepeatCancel ( Unit target)
153{
155 data << target->GetPackGUID(); // may be it's target guid
156 SendMessageToSet(&data, true);
157}
@ SMSG_CANCEL_AUTO_REPEAT
Definition: Opcodes.h:698
std::size_t size() const
Definition: ObjectGuid.h:274

References Object::GetPackGUID(), SendMessageToSet(), PackedGuid::size(), and SMSG_CANCEL_AUTO_REPEAT.

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), and Unit::InterruptSpell().

◆ SendBattlefieldWorldStates()

void Player::SendBattlefieldWorldStates ( )

Send misc stuff that needs to be sent on every login, like the battle timers.

8860{
8862 if (sWorld->getIntConfig(CONFIG_WINTERGRASP_ENABLE) == 1)
8863 {
8864 if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
8865 {
8866 wg->SendUpdateWorldStates(this);
8867 }
8868 }
8869}
@ CONFIG_WINTERGRASP_ENABLE
Definition: IWorld.h:327
Definition: BattlefieldWG.h:253

References BATTLEFIELD_BATTLEID_WG, CONFIG_WINTERGRASP_ENABLE, sBattlefieldMgr, and sWorld.

Referenced by SendInitWorldStates().

◆ SendBGWeekendWorldStates()

void Player::SendBGWeekendWorldStates ( )
8845{
8846 for (uint32 i = 1; i < sBattlemasterListStore.GetNumRows(); ++i)
8847 {
8848 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(i);
8849 if (bl && bl->HolidayWorldStateId)
8850 {
8853 else
8855 }
8856 }
8857}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
static bool IsBGWeekend(BattlegroundTypeId bgTypeId)
Definition: BattlegroundMgr.cpp:910
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition: PlayerUpdates.cpp:2243
Definition: DBCStructure.h:604
uint32 HolidayWorldStateId
Definition: DBCStructure.h:612
uint32 id
Definition: DBCStructure.h:605

References BattlemasterListEntry::HolidayWorldStateId, BattlemasterListEntry::id, BattlegroundMgr::IsBGWeekend(), sBattlemasterListStore, and SendUpdateWorldState().

Referenced by SendInitWorldStates().

◆ SendBuyError()

void Player::SendBuyError ( BuyResult  msg,
Creature creature,
uint32  item,
uint32  param 
)
4065{
4066 LOG_DEBUG("network", "WORLD: Sent SMSG_BUY_FAILED");
4067 WorldPacket data(SMSG_BUY_FAILED, (8 + 4 + 4 + 1));
4068 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4069 data << uint32(item);
4070 if (param > 0)
4071 data << uint32(param);
4072 data << uint8(msg);
4073 GetSession()->SendPacket(&data);
4074}
@ SMSG_BUY_FAILED
Definition: Opcodes.h:451

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_BUY_FAILED.

Referenced by BuyItemFromVendorSlot(), WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendBuyErrorCommand(), WorldSession::HandlePetitionBuyOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), ProcessCastaction(), ProcessUnlearnAction(), and resetTalents().

◆ SendCanTakeQuestResponse()

◆ SendCinematicStart()

void Player::SendCinematicStart ( uint32  CinematicSequenceId) const
5719{
5721 data << uint32(CinematicSequenceId);
5722 SendDirectMessage(&data);
5723 if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId))
5724 {
5725 _cinematicMgr->SetActiveCinematicCamera(sequence->cinematicCamera);
5726 }
5727}
DBCStorage< CinematicSequencesEntry > sCinematicSequencesStore(CinematicSequencesEntryfmt)
@ SMSG_TRIGGER_CINEMATIC
Definition: Opcodes.h:280
void SetActiveCinematicCamera(uint32 cinematicCameraId=0)
Definition: CinematicMgr.h:41
Definition: DBCStructure.h:713

References _cinematicMgr, sCinematicSequencesStore, SendDirectMessage(), CinematicMgr::SetActiveCinematicCamera(), and SMSG_TRIGGER_CINEMATIC.

Referenced by debug_commandscript::HandleDebugPlayCinematicCommand(), WorldSession::HandlePlayerLoginFromDB(), and GameObject::Use().

◆ SendClearCooldown()

void Player::SendClearCooldown ( uint32  spell_id,
Unit target 
)

◆ SendCooldownEvent()

void Player::SendCooldownEvent ( SpellInfo const *  spellInfo,
uint32  itemId = 0,
Spell spell = nullptr,
bool  setCooldown = true 
)
11057{
11058 // start cooldowns at server side, if any
11059 if (setCooldown)
11060 AddSpellAndCategoryCooldowns(spellInfo, itemId, spell);
11061
11062 // Send activate cooldown timer (possible 0) at client side
11063 WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8);
11064 data << uint32(spellInfo->Id);
11065 data << GetGUID();
11066 SendDirectMessage(&data);
11067}
@ SMSG_COOLDOWN_EVENT
Definition: Opcodes.h:339
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10858

References AddSpellAndCategoryCooldowns(), Object::GetGUID(), SpellInfo::Id, SendDirectMessage(), and SMSG_COOLDOWN_EVENT.

Referenced by Spell::_handle_finish_phase(), Aura::_UnapplyForTarget(), Spell::finish(), Unit::RemoveGameObject(), Unit::SetMinion(), and UpdatePotionCooldown().

◆ SendCorpseReclaimDelay()

void Player::SendCorpseReclaimDelay ( uint32  delay)
12923{
12925 data << uint32(delay);
12926 GetSession()->SendPacket(&data);
12927}
@ SMSG_CORPSE_RECLAIM_DELAY
Definition: Opcodes.h:647

References GetSession(), WorldSession::SendPacket(), and SMSG_CORPSE_RECLAIM_DELAY.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ SendDirectMessage()

void Player::SendDirectMessage ( WorldPacket const *  data) const
5714{
5715 m_session->SendPacket(data);
5716}

References m_session, and WorldSession::SendPacket().

Referenced by Guild::_SendBankList(), Group::AddMember(), AddSpellAndCategoryCooldowns(), Creature::AddSpellCooldown(), AddSpellMod(), DoRandomRoll(), DuelComplete(), Spell::EffectBind(), Spell::EffectPlayMusic(), BGQueueRemoveEvent::Execute(), GiveLevel(), Aura::HandleAuraSpecificMods(), debug_commandscript::HandleDebugCooldownCommand(), Guild::HandleInviteMember(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), Unit::Kill(), Pet::learnSpell(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), WorldObject::PlayDirectMusic(), WorldObject::PlayDirectSound(), WorldObject::PlayDistanceSound(), AchievementMgr::RemoveCriteriaProgress(), AchievementMgr::Reset(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), SendCinematicStart(), SendClearCooldown(), Unit::SendComboPoints(), SendCooldownEvent(), AchievementMgr::SendCriteriaUpdate(), SendDurabilityLoss(), WeatherMgr::SendFineWeatherUpdateToPlayer(), ReputationMgr::SendForceReactions(), ReputationMgr::SendInitialReputations(), Map::SendInitSelf(), SendInitWorldStates(), BattlefieldWG::SendInitWorldStatesTo(), SendLoot(), SendLootError(), SendLootRelease(), Unit::SendMeleeAttackStart(), SendMessageToSet(), SendMessageToSetInRange(), SendMirrorTimer(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), SendMovieStart(), WorldSessionMgr::SendServerMessage(), Unit::SendSpellNonMeleeReflectLog(), ReputationMgr::SendState(), Unit::SendTameFailure(), SendTaxiNodeStatusMultiple(), SendUpdateWorldState(), BattlefieldWG::SendUpdateWorldStateMessage(), ReputationMgr::SendVisible(), Weather::SendWeatherUpdateToPlayer(), ChatHandler::SendWorldTextOptional(), Map::SendZoneDynamicInfo(), SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), SetDisableGravity(), SetFeatherFall(), Creature::SetFeatherFall(), SetHover(), Unit::SetOwnerGUID(), Unit::SetRooted(), SetWaterWalking(), Creature::SetWaterWalking(), StopMirrorTimer(), Pet::unlearnSpell(), Unit::Whisper(), and Whisper().

◆ SendDuelCountdown()

void Player::SendDuelCountdown ( uint32  counter)
15291{
15293 data << uint32(counter); // seconds
15294 GetSession()->SendPacket(&data);
15295}
@ SMSG_DUEL_COUNTDOWN
Definition: Opcodes.h:725

References GetSession(), WorldSession::SendPacket(), and SMSG_DUEL_COUNTDOWN.

Referenced by WorldSession::HandleDuelAcceptedOpcode().

◆ SendDungeonDifficulty()

void Player::SendDungeonDifficulty ( bool  IsInGroup)

◆ SendDurabilityLoss()

void Player::SendDurabilityLoss ( )

◆ SendEnchantmentDurations()

void Player::SendEnchantmentDurations ( )
4727{
4728 for (EnchantDurationList::const_iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4729 {
4730 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), itr->item->GetGUID(), itr->slot, uint32(itr->leftduration) / 1000);
4731 }
4732}

References Object::GetGUID(), GetSession(), m_enchantDuration, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendEquipError()

void Player::SendEquipError ( InventoryResult  msg,
Item pItem,
Item pItem2 = nullptr,
uint32  itemid = 0 
)
4022{
4023 LOG_DEBUG("network", "WORLD: Sent SMSG_INVENTORY_CHANGE_FAILURE ({})", msg);
4025 data << uint8(msg);
4026
4027 if (msg != EQUIP_ERR_OK)
4028 {
4029 data << (pItem ? pItem->GetGUID() : ObjectGuid::Empty);
4030 data << (pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty);
4031 data << uint8(0); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2
4032
4033 switch (msg)
4034 {
4037 {
4038 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4039 data << uint32(proto ? proto->RequiredLevel : 0);
4040 break;
4041 }
4042 case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: // no idea about this one...
4043 {
4044 data << ObjectGuid::Empty; // item guid
4045 data << uint32(0); // slot
4046 data << ObjectGuid::Empty; // container
4047 break;
4048 }
4052 {
4053 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4054 data << uint32(proto ? proto->ItemLimitCategory : 0);
4055 break;
4056 }
4057 default:
4058 break;
4059 }
4060 }
4061 GetSession()->SendPacket(&data);
4062}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED
Definition: Item.h:131
@ EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM
Definition: Item.h:127
@ EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW
Definition: Item.h:133
@ SMSG_INVENTORY_CHANGE_FAILURE
Definition: Opcodes.h:304
uint32 RequiredLevel
Definition: ItemTemplate.h:636

References ObjectGuid::Empty, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED, EQUIP_ERR_OK, EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW, Object::GetGUID(), GetSession(), Item::GetTemplate(), ItemTemplate::ItemLimitCategory, LOG_DEBUG, ItemTemplate::RequiredLevel, WorldSession::SendPacket(), SMSG_INVENTORY_CHANGE_FAILURE, and sObjectMgr.

Referenced by _StoreOrEquipNewItem(), AutoStoreLoot(), BuyItemFromVendorSlot(), CanAddQuest(), CanRewardQuest(), CastItemUseSpell(), Spell::CheckItems(), Group::CountTheRoll(), Spell::DoCreateItem(), Spell::EffectRechargeManaGem(), GiveQuestSourceItem(), WorldSession::HandleAcceptTradeOpcode(), misc_commandscript::HandleAddItemSetCommand(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), AuraEffect::HandleChannelDeathItem(), debug_commandscript::HandleDebugSendEquipErrorCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleReadItem(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSocketOpcode(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), WorldSession::HandleUseItemOpcode(), WorldSession::HandleWrapItemOpcode(), ModifyMoney(), item_petrov_cluster_bombs::OnUse(), item_only_for_flight::OnUse(), item_incendiary_explosives::OnUse(), item_captured_frog::OnUse(), ProcessUnlearnAction(), SetAmmo(), SplitItem(), StoreLootItem(), SwapItem(), and TakeQuestSourceItem().

◆ SendEquipmentSetList()

void Player::SendEquipmentSetList ( )
14419{
14420 uint32 count = 0;
14422 std::size_t count_pos = data.wpos();
14423 data << uint32(count); // count placeholder
14424 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14425 {
14426 if (itr->second.state == EQUIPMENT_SET_DELETED)
14427 continue;
14428
14429 data.appendPackGUID(itr->second.Guid);
14430 data << uint32(itr->first);
14431 data << itr->second.Name;
14432 data << itr->second.IconName;
14433 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14434 {
14435 // ignored slots stored in IgnoreMask, client wants "1" as raw GUID, so no HighGuid::Item
14436 if (itr->second.IgnoreMask & (1 << i))
14437 data.appendPackGUID(uint64(1));
14438 else // xinef: send proper data (do not append 0 with high guid)
14439 data.appendPackGUID(itr->second.Items[i] ? itr->second.Items[i].GetRawValue() : uint64(0));
14440 }
14441
14442 ++count; // client have limit but it checked at loading and set
14443 }
14444 data.put<uint32>(count_pos, count);
14445 GetSession()->SendPacket(&data);
14446}
@ SMSG_EQUIPMENT_SET_LIST
Definition: Opcodes.h:1242

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_DELETED, EQUIPMENT_SLOT_END, GetSession(), m_EquipmentSets, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_EQUIPMENT_SET_LIST, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendExplorationExperience()

void Player::SendExplorationExperience ( uint32  Area,
uint32  Experience 
)
160{
162 data << uint32(Area);
163 data << uint32(Experience);
164 GetSession()->SendPacket(&data);
165}
@ SMSG_EXPLORATION_EXPERIENCE
Definition: Opcodes.h:534

References GetSession(), WorldSession::SendPacket(), and SMSG_EXPLORATION_EXPERIENCE.

Referenced by CheckAreaExploreAndOutdoor().

◆ SendInitialActionButtons()

void Player::SendInitialActionButtons ( ) const
inline

◆ SendInitialPacketsAfterAddToMap()

void Player::SendInitialPacketsAfterAddToMap ( )
11584{
11586
11589
11590 CastSpell(this, 836, true); // LOGINEFFECT
11591
11592 // set some aura effects that send packet to player client after add player to map
11593 // SendMessageToSet not send it to player not it map, only for aura that not changed anything at re-apply
11594 // same auras state lost at far teleport, send it one more time in this case also
11595 static const AuraType auratypes[] =
11596 {
11600 };
11601 for (AuraType const* itr = &auratypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
11602 {
11603 Unit::AuraEffectList const& auraList = GetAuraEffectsByType(*itr);
11604 if (!auraList.empty())
11605 auraList.front()->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
11606 }
11607
11608 // Fix mount, update block gets messed somewhere
11609 {
11611 {
11612 AddAura(GetMountBlockId(), this);
11613 SetMountBlockId(0);
11614 }
11615 }
11616
11617 // update zone
11618 uint32 newzone, newarea;
11619 GetZoneAndAreaId(newzone, newarea);
11620 UpdateZone(newzone, newarea); // also call SendInitWorldStates();
11621
11622 if (HasStunAura())
11624
11625 // manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied.
11626 if (HasRootAura())
11627 {
11629 data2 << GetPackGUID();
11630 data2 << (uint32)2;
11631 SendMessageToSet(&data2, true);
11632 }
11633
11634 SendEnchantmentDurations(); // must be after add to map
11635 SendItemDurations(); // must be after add to map
11638
11639 // raid downscaling - send difficulty to player
11640 if (GetMap()->IsRaid())
11641 {
11643 {
11646 }
11647 }
11649 SendRaidDifficulty(GetGroup() != nullptr);
11650}
AuraType
Definition: SpellAuraDefines.h:62
@ SPELL_AURA_FEATHER_FALL
Definition: SpellAuraDefines.h:168
@ SPELL_AURA_FLY
Definition: SpellAuraDefines.h:264
@ SPELL_AURA_WATER_WALK
Definition: SpellAuraDefines.h:167
@ SPELL_AURA_HOVER
Definition: SpellAuraDefines.h:169
@ SPELL_AURA_TRANSFORM
Definition: SpellAuraDefines.h:119
@ SPELL_AURA_NONE
Definition: SpellAuraDefines.h:63
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition: SpellAuraDefines.h:43
@ SMSG_FORCE_MOVE_ROOT
Definition: Opcodes.h:262
void UpdateVisibilityForPlayer(bool mapChange=false)
Definition: PlayerUpdates.cpp:1592
uint32 GetMountBlockId()
Definition: Player.h:2614
void SendTaxiNodeStatusMultiple()
Definition: Player.cpp:10454
Difficulty GetStoredRaidDifficulty() const
Definition: Player.h:1931
void SendEnchantmentDurations()
Definition: PlayerStorage.cpp:4726
void SendItemDurations()
Definition: PlayerStorage.cpp:4742
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition: PlayerMisc.cpp:177
bool HasStunAura() const
Definition: Unit.h:1744
bool HasMountedAura() const
Definition: Unit.h:1704
bool HasRootAura() const
Definition: Unit.h:1743
void SendTimeSync()
Definition: WorldSession.cpp:1406
void ResetTimeSync()
Definition: WorldSession.cpp:1400

References Unit::AddAura(), AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Unit::CastSpell(), Unit::GetAuraEffectsByType(), GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetMountBlockId(), Object::GetPackGUID(), GetRaidDifficulty(), GetSession(), GetStoredRaidDifficulty(), WorldObject::GetZoneAndAreaId(), Unit::HasMountedAura(), Unit::HasRootAura(), Unit::HasStunAura(), isBeingLoaded(), MOVE_ROOT, WorldSession::ResetTimeSync(), SendEnchantmentDurations(), SendItemDurations(), SendMessageToSet(), SendQuestGiverStatusMultiple(), SendRaidDifficulty(), SendTaxiNodeStatusMultiple(), WorldSession::SendTimeSync(), SetMountBlockId(), SetMovement(), SMSG_FORCE_MOVE_ROOT, SPELL_AURA_FEATHER_FALL, SPELL_AURA_FLY, SPELL_AURA_HOVER, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_NONE, SPELL_AURA_SAFE_FALL, SPELL_AURA_TRANSFORM, SPELL_AURA_WATER_WALK, StoreRaidMapDifficulty(), UpdateVisibilityForPlayer(), and UpdateZone().

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialPacketsBeforeAddToMap()

void Player::SendInitialPacketsBeforeAddToMap ( )

Pass 'this' as argument because we're not stored in ObjectAccessor yet

11527{
11530
11531 // guild bank list?
11532
11533 // Homebind
11534 WorldPacket data(SMSG_BINDPOINTUPDATE, 5 * 4);
11535 data << m_homebindX << m_homebindY << m_homebindZ;
11536 data << (uint32) m_homebindMapId;
11537 data << (uint32) m_homebindAreaId;
11538 GetSession()->SendPacket(&data);
11539
11540 // SMSG_SET_PROFICIENCY
11541 // SMSG_SET_PCT_SPELL_MODIFIER
11542 // SMSG_SET_FLAT_SPELL_MODIFIER
11543 // SMSG_UPDATE_AURA_DURATION
11544
11545 SendTalentsInfoData(false);
11546
11547 // SMSG_INSTANCE_DIFFICULTY
11548 data.Initialize(SMSG_INSTANCE_DIFFICULTY, 4 + 4);
11549 data << uint32(GetMap()->GetDifficulty());
11550 data << uint32(GetMap()->GetEntry()->IsDynamicDifficultyMap() && GetMap()->IsHeroic()); // Raid dynamic difficulty
11551 GetSession()->SendPacket(&data);
11552
11554
11555 data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
11556 data << uint32(0); // count, for (count) uint32;
11557 GetSession()->SendPacket(&data);
11558
11562
11564
11565 data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
11566 data.AppendPackedTime(GameTime::GetGameTime().count());
11567 data << float(0.01666667f); // game speed
11568 data << uint32(0); // added in 3.1.2
11569 GetSession()->SendPacket(&data);
11570
11571 GetReputationMgr().SendForceReactions(); // SMSG_SET_FORCED_REACTIONS
11572
11573 // SMSG_TALENTS_INFO x 2 for pet (unspent points and talents in separate packets...)
11574 // SMSG_PET_GUIDS
11575 // SMSG_UPDATE_WORLD_STATE
11576 // SMSG_POWER_UPDATE
11577
11578 SetMover(this);
11579
11580 sScriptMgr->OnPlayerSendInitialPacketsBeforeAddToMap(this, data);
11581}
@ SMSG_INSTANCE_DIFFICULTY
Definition: Opcodes.h:857
@ SMSG_BINDPOINTUPDATE
Definition: Opcodes.h:371
@ SMSG_LOGIN_SETTIMESPEED
Definition: Opcodes.h:96
@ SMSG_SEND_UNLEARN_SPELLS
Definition: Opcodes.h:1084
void SendAllAchievementData() const
Definition: AchievementMgr.cpp:2378
void SendInitialSpells()
Definition: Player.cpp:2758
PlayerSocial * GetSocial()
Definition: Player.h:1159
void SendInitialActionButtons() const
Definition: Player.h:1851
void SendEquipmentSetList()
Definition: Player.cpp:14418
void SetMover(Unit *target)
Definition: Player.cpp:12841
void SendSocialList(Player *player, uint32 flags)
Definition: SocialMgr.cpp:124
void SendInitialReputations()
Definition: ReputationMgr.cpp:211
void SendForceReactions()
Definition: ReputationMgr.cpp:165

References ByteBuffer::AppendPackedTime(), GetDifficulty(), Object::GetEntry(), GameTime::GetGameTime(), WorldObject::GetMap(), GetReputationMgr(), GetSession(), GetSocial(), WorldPacket::Initialize(), m_achievementMgr, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_reputationMgr, AchievementMgr::SendAllAchievementData(), SendEquipmentSetList(), ReputationMgr::SendForceReactions(), SendInitialActionButtons(), ReputationMgr::SendInitialReputations(), SendInitialSpells(), WorldSession::SendPacket(), PlayerSocial::SendSocialList(), SendTalentsInfoData(), SetMover(), SMSG_BINDPOINTUPDATE, SMSG_INSTANCE_DIFFICULTY, SMSG_LOGIN_SETTIMESPEED, SMSG_SEND_UNLEARN_SPELLS, SOCIAL_FLAG_ALL, and sScriptMgr.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialSpells()

void Player::SendInitialSpells ( )
2759{
2760 uint32 curTime = GameTime::GetGameTimeMS().count();
2762
2763 uint16 spellCount = 0;
2764
2765 WorldPacket data(SMSG_INITIAL_SPELLS, (1 + 2 + 4 * m_spells.size() + 2 + m_spellCooldowns.size() * (4 + 2 + 2 + 4 + 4)));
2766 data << uint8(0);
2767
2768 std::size_t countPos = data.wpos();
2769 data << uint16(spellCount); // spell count placeholder
2770
2771 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
2772 {
2773 if (itr->second->State == PLAYERSPELL_REMOVED)
2774 continue;
2775
2776 if (!itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
2777 continue;
2778
2779 data << uint32(itr->first);
2780 data << uint16(0); // it's not slot id
2781
2782 ++spellCount;
2783 }
2784
2785 // Added spells from glyphs too (needed by spell tooltips)
2786 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
2787 {
2788 if (uint32 glyph = GetGlyph(i))
2789 {
2790 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
2791 {
2792 data << uint32(glyphEntry->SpellId);
2793 data << uint16(0); // it's not slot id
2794
2795 ++spellCount;
2796 }
2797 }
2798 }
2799
2800 // xinef: we have to send talents, but not those on m_spells list
2801 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
2802 {
2803 if (itr->second->State == PLAYERSPELL_REMOVED)
2804 continue;
2805
2806 // xinef: remove all active talent auras
2807 if (!(itr->second->specMask & GetActiveSpecMask()))
2808 continue;
2809
2810 // xinef: already sent from m_spells
2811 if (itr->second->inSpellBook)
2812 continue;
2813
2814 data << uint32(itr->first);
2815 data << uint16(0); // it's not slot id
2816
2817 ++spellCount;
2818 }
2819
2820 data.put<uint16>(countPos, spellCount); // write real count value
2821
2822 uint16 spellCooldowns = m_spellCooldowns.size();
2823 data << uint16(spellCooldowns);
2824 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
2825 {
2826 if (!itr->second.needSendToClient)
2827 continue;
2828
2829 SpellInfo const* sEntry = sSpellMgr->GetSpellInfo(itr->first);
2830 if (!sEntry)
2831 continue;
2832
2833 data << uint32(itr->first);
2834
2835 data << uint16(itr->second.itemid); // cast item id
2836 data << uint16(itr->second.category); // spell category
2837
2838 // send infinity cooldown in special format
2839 if (itr->second.end >= infTime)
2840 {
2841 data << uint32(1); // cooldown
2842 data << uint32(0x80000000); // category cooldown
2843 continue;
2844 }
2845
2846 uint32 cooldown = itr->second.end > curTime ? itr->second.end - curTime : 0;
2847 data << uint32(itr->second.category ? 0 : cooldown); // cooldown
2848 data << uint32(itr->second.category ? cooldown : 0); // category cooldown
2849 }
2850
2851 GetSession()->SendPacket(&data);
2852}
@ SMSG_INITIAL_SPELLS
Definition: Opcodes.h:328

References GetActiveSpec(), GetActiveSpecMask(), GameTime::GetGameTimeMS(), GetGlyph(), GetSession(), infinityCooldownDelayCheck, m_spellCooldowns, m_spells, m_talents, MAX_GLYPH_SLOT_INDEX, PLAYERSPELL_REMOVED, ByteBuffer::put(), WorldSession::SendPacket(), sGlyphPropertiesStore, SMSG_INITIAL_SPELLS, sSpellMgr, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendInitWorldStates()

void Player::SendInitWorldStates ( uint32  zoneId,
uint32  areaId 
)
8189{
8190 // data depends on zoneid/mapid...
8191 uint32 mapId = GetMapId();
8192 Battleground* battleground = GetBattleground();
8193 OutdoorPvP* outdoorPvP = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneId);
8194 InstanceScript* instance = GetInstanceScript();
8195 Battlefield* battlefield = sBattlefieldMgr->GetBattlefieldToZoneId(zoneId);
8196
8197 LOG_DEBUG("network", "Sending SMSG_INIT_WORLD_STATES to Map: {}, Zone: {}", mapId, zoneId);
8198
8200 packet.MapID = mapId;
8201 packet.ZoneID = zoneId;
8202 packet.AreaID = areaId;
8203
8204 packet.Worldstates.reserve(8);
8206 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_AZSHARA, 0);
8209 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_TANARIS, 0);
8211
8212 // 7 1 - Arena season in progress, 0 - end of season
8214 // 8 Arena season id
8215 packet.Worldstates.emplace_back(WORLD_STATE_ARENA_SEASON_ID, sArenaSeasonMgr->GetCurrentSeason());
8216
8217 if (mapId == MAP_OUTLAND)
8218 {
8219 packet.Worldstates.reserve(3);
8221 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_GUARDS_MAX, 15);
8222 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_GUARDS_LEFT, 15);
8223 }
8224
8226 {
8227 Player::bgZoneIdToFillWorldStates[zoneId](battleground, packet);
8228 }
8229 else
8230 {
8231 // insert <field> <value>
8232 switch (zoneId)
8233 {
8234 case AREA_DUN_MOROGH:
8235 case AREA_WETLANDS:
8236 case AREA_ELWYNN_FOREST:
8237 case AREA_LOCH_MODAN:
8238 case AREA_WESTFALL:
8239 case AREA_SEARING_GORGE:
8241 case AREA_IRONFORGE:
8242 case AREA_DEEPRUN_TRAM:
8244 break;
8246 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_EP)
8247 outdoorPvP->FillInitialWorldStates(packet);
8248 else
8249 {
8250 packet.Worldstates.reserve(32);
8252 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_A, 0);
8253 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_H, 0);
8255 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_N, 50);
8256 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N, 1);
8259 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_7, 0);
8260 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_8, 0);
8261 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_A, 0);
8262 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_H, 0);
8263 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_A, 0);
8264 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_H, 0);
8265 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_0, 0);
8266 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_1, 0);
8267 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_A, 0);
8268 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_H, 0);
8269 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_N, 1);
8270 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N, 1);
8273 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_2, 0);
8274 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_3, 0);
8275 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_NORTHPASSTOWER_A, 0);
8276 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_NORTHPASSTOWER_H, 0);
8277 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N, 1);
8279 //packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_4, 1);
8280 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_5, 0);
8281 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_6, 0);
8282 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_A, 0);
8283 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_H, 0);
8284
8285 break;
8286 case AREA_SILITHUS:
8287 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_SI)
8288 outdoorPvP->FillInitialWorldStates(packet);
8289 else
8290 {
8291 packet.Worldstates.reserve(3);
8292 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_SI_GATHERED_A, 0);
8293 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_SI_GATHERED_H, 0);
8294 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_SI_SILITHYST_MAX, 0);
8295 }
8296 // unknown, aq opening?
8297 packet.Worldstates.reserve(4);
8298 packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_N, 0);
8299 packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_S, 0);
8300 packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_SW, 0);
8301 packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_E, 0);
8302 break;
8304 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_AV)
8305 battleground->FillInitialWorldStates(packet);
8306 else
8307 {
8308 packet.Worldstates.reserve(75);
8312 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_A_A, 0);
8317 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_N_MINE_N, 1);
8323 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_5, 0);
8326 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_4, 0);
8331 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_3, 1);
8343 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_1, 0);
8344 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_0, 0);
8352 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_2, 0);
8361 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_N_MINE_H, 0);
8362 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_N_MINE_A, 0);
8363 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_S_MINE_N, 1);
8364 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_S_MINE_H, 0);
8365 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_S_MINE_A, 0);
8381 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_H_A, 0);
8382 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_H_C, 0);
8383 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_A_C, 1);
8384 }
8385 break;
8386 case AREA_WARSONG_GULCH:
8387 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_WS)
8388 battleground->FillInitialWorldStates(packet);
8389 else
8390 {
8391 packet.Worldstates.reserve(8);
8394 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_WS_UNK_0, 0);
8395 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_WS_UNK_1, 0);
8396 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_WS_UNK_2, 2);
8400 }
8401 break;
8402 case AREA_ARATHI_BASIN:
8403 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_AB)
8404 battleground->FillInitialWorldStates(packet);
8405 else
8406 {
8407 packet.Worldstates.reserve(32);
8420 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_RESOURCES_MAX, 1600);
8436 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_FARM_ICON, 1);
8438 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_UNK, 2);
8439 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_RESOURCES_WARNING, 1400); // warning limit (1400)
8440 }
8441 break;
8443 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_EY)
8444 battleground->FillInitialWorldStates(packet);
8445 else
8446 {
8447 packet.Worldstates.reserve(32);
8456 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_UNK_2, 0);
8457 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_UNK_1, 0);
8470 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_FLAG, 1);
8475 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_UNK_0, 142);
8479 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_UNK_3, 379);
8480 // missing unknowns
8481 }
8482 break;
8483 // any of these needs change! the client remembers the prev setting!
8484 // ON EVERY ZONE LEAVE, RESET THE OLD ZONE'S WORLD STATE, BUT AT LEAST THE UI STUFF!
8486 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_HP)
8487 outdoorPvP->FillInitialWorldStates(packet);
8488 else
8489 {
8490 packet.Worldstates.reserve(16);
8493 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_BROKENHILL_N, 0);
8494 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_BROKENHILL_H, 1);
8495 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_BROKENHILL_A, 0);
8496 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_OVERLOOK_N, 0);
8497 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_OVERLOOK_H, 1);
8498 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_OVERLOOK_A, 0);
8499 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_H, 0);
8500 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_A, 0);
8501 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_N, 100);
8504 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_STADIUM_N, 0);
8505 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_STADIUM_A, 0);
8506 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_STADIUM_H, 1);
8507 }
8508 break;
8509 case AREA_NAGRAND:
8510 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_NA)
8511 outdoorPvP->FillInitialWorldStates(packet);
8512 else
8513 {
8514 packet.Worldstates.reserve(28);
8517 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_GUARDS_MAX, 0);
8518 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_GUARDS_LEFT, 0);
8521 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_SLIDER_N, 0);
8532 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_H, 0);
8533 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_A, 0);
8536 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_H, 0);
8537 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_A, 0);
8538 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_NEUTRAL, 0);
8539 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_A, 0);
8540 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_H, 0);
8541 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_HORDE, 0);
8543 }
8544 break;
8546 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_TF)
8547 outdoorPvP->FillInitialWorldStates(packet);
8548 else
8549 {
8550 packet.Worldstates.reserve(28);
8552 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_N, 20);
8554 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_H, 0);
8555 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_A, 5);
8557 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_14, 0);
8558 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_13, 0);
8559 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_12, 0);
8560 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_11, 0);
8561 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_10, 0);
8562 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_09, 0);
8563 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_08, 0);
8564 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_07, 0);
8565 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_06, 0);
8566 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_15, 0);
8567 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_05, 0);
8568 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_04, 0);
8569 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_03, 0);
8570 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_02, 0);
8571 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_01, 0);
8572 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_00, 0);
8579 }
8580 break;
8581 case AREA_ZANGARMARSH:
8582 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_ZM)
8583 outdoorPvP->FillInitialWorldStates(packet);
8584 else
8585 {
8586 packet.Worldstates.reserve(26);
8590 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UNK, 1);
8591 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_N, 0);
8592 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_H, 1);
8593 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_A, 0);
8594 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_H, 1);
8595 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_A, 0);
8596 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_N, 0);
8597 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_N, 0);
8598 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_H, 1);
8599 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_A, 0);
8603 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_N, 0);
8604 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_H, 1);
8605 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_A, 0);
8606 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_N, 0);
8607 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_H, 1);
8608 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_A, 0);
8613 }
8614 break;
8615 case AREA_NAGRAND_ARENA:
8616 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_NA)
8617 battleground->FillInitialWorldStates(packet);
8618 else
8619 {
8620 packet.Worldstates.reserve(3);
8624 }
8625 break;
8627 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_BE)
8628 battleground->FillInitialWorldStates(packet);
8629 else
8630 {
8631 packet.Worldstates.reserve(3);
8635 }
8636 break;
8638 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_RL)
8639 battleground->FillInitialWorldStates(packet);
8640 else
8641 {
8642 packet.Worldstates.reserve(3);
8646 }
8647 break;
8648 case AREA_DALARAN_ARENA:
8649 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_DS)
8650 battleground->FillInitialWorldStates(packet);
8651 else
8652 {
8653 packet.Worldstates.reserve(3);
8657 }
8658 break;
8660 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_SA)
8661 battleground->FillInitialWorldStates(packet);
8662 else
8663 {
8664 packet.Worldstates.reserve(24);
8668 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_SA_BLUE_GATE, 0);
8669 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_SA_RED_GATE, 0);
8674
8675 // End Round timer, example: 19:59 -> A:BC
8678 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_SA_TIMER_MINUTES, 0); // A
8679
8692 // missing unknowns
8693 }
8694 break;
8696 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_RV)
8697 battleground->FillInitialWorldStates(packet);
8698 else
8699 {
8700 packet.Worldstates.reserve(3);
8704 }
8705 break;
8707 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_IC)
8708 battleground->FillInitialWorldStates(packet);
8709 else
8710 {
8711 packet.Worldstates.reserve(18);
8728 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_IC_UNK, 1);
8730 }
8731 break;
8733 if (instance)
8734 instance->FillInitialWorldStates(packet);
8735 else
8736 {
8737 packet.Worldstates.reserve(3);
8741 }
8742 break;
8744 if (instance && mapId == MAP_ICECROWN_CITADEL)
8745 instance->FillInitialWorldStates(packet);
8746 else
8747 {
8748 packet.Worldstates.reserve(5);
8754 }
8755 break;
8757 if (instance && mapId == MAP_THE_CULLING_OF_STRATHOLME)
8758 instance->FillInitialWorldStates(packet);
8759 else
8760 {
8761 packet.Worldstates.reserve(5);
8767 }
8768 break;
8769 case AREA_THE_OCULUS:
8770 if (instance && mapId == MAP_THE_OCULUS)
8771 instance->FillInitialWorldStates(packet);
8772 else
8773 {
8774 packet.Worldstates.reserve(2);
8777 }
8778 break;
8779 case AREA_ULDUAR:
8780 if (instance && mapId == MAP_ULDUAR)
8781 instance->FillInitialWorldStates(packet);
8782 else
8783 {
8784 packet.Worldstates.reserve(2);
8787 }
8788 break;
8790 if (instance)
8791 instance->FillInitialWorldStates(packet);
8792 else
8793 {
8794 packet.Worldstates.reserve(3);
8795 packet.Worldstates.emplace_back(WORLD_STATE_VIOLET_HOLD_SHOW, 0);
8796 packet.Worldstates.emplace_back(WORLD_STATE_VIOLET_HOLD_PRISON_STATE, 100);
8797 packet.Worldstates.emplace_back(WORLD_STATE_VIOLET_HOLD_WAVE_COUNT, 0);
8798 }
8799 break;
8801 if (instance && mapId == MAP_HALLS_OF_REFLECTION)
8802 instance->FillInitialWorldStates(packet);
8803 else
8804 {
8805 packet.Worldstates.reserve(2);
8808 }
8809 break;
8810 case AREA_PLAGUELANDS_THE_SCARLET_ENCLAVE: // (DK starting zone)
8811 // Get Mograine, GUID and ENTRY should NEVER change
8812 if (Creature* mograine = ObjectAccessor::GetCreature(*this, ObjectGuid::Create<HighGuid::Unit>(29173, 130956)))
8813 {
8814 if (CreatureAI* mograineAI = mograine->AI())
8815 {
8816 packet.Worldstates.reserve(6);
8817 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_DEFENDERS_COUNT, mograineAI->GetData(3590));
8818 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SCOURGE_COUNT, mograineAI->GetData(3591));
8819 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SOLDIERS_ENABLE, mograineAI->GetData(3592));
8820 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_ENABLE, mograineAI->GetData(3603));
8821 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_TIME, mograineAI->GetData(3604));
8822 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_EVENT_BEGIN_ENABLE, mograineAI->GetData(3605));
8823 }
8824 }
8825 break;
8826 case AREA_WINTERGRASP:
8827 if (battlefield && battlefield->GetTypeId() == BATTLEFIELD_WG)
8828 {
8829 battlefield->FillInitialWorldStates(packet);
8830 break;
8831 }
8832 default:
8833 break;
8834 }
8835 }
8836 }
8837
8838 sWorldState->FillInitialWorldStates(packet, zoneId, areaId);
8839 SendDirectMessage(packet.Write());
8842}
@ MAP_THE_CULLING_OF_STRATHOLME
Definition: AreaDefines.h:248
@ MAP_ICECROWN_CITADEL
Definition: AreaDefines.h:264
@ MAP_THE_OCULUS
Definition: AreaDefines.h:245
@ MAP_HALLS_OF_REFLECTION
Definition: AreaDefines.h:269
@ MAP_OUTLAND
Definition: AreaDefines.h:215
@ MAP_ULDUAR
Definition: AreaDefines.h:253
@ AREA_PLAGUELANDS_THE_SCARLET_ENCLAVE
Definition: AreaDefines.h:146
@ ARENA_THE_RING_OF_VALOR
Definition: AreaDefines.h:150
@ AREA_THE_RUBY_SANCTUM
Definition: AreaDefines.h:179
@ AREA_WETLANDS
Definition: AreaDefines.h:30
@ AREA_IRONFORGE
Definition: AreaDefines.h:81
@ AREA_STRAND_OF_THE_ANCIENTS
Definition: AreaDefines.h:148
@ AREA_WESTFALL
Definition: AreaDefines.h:38
@ AREA_WARSONG_GULCH
Definition: AreaDefines.h:91
@ AREA_NAGRAND
Definition: AreaDefines.h:98
@ AREA_THE_VIOLET_HOLD
Definition: AreaDefines.h:151
@ AREA_RUINS_OF_LORDAERON
Definition: AreaDefines.h:135
@ AREA_HALLS_OF_REFLECTION
Definition: AreaDefines.h:173
@ AREA_LOCH_MODAN
Definition: AreaDefines.h:37
@ AREA_DEEPRUN_TRAM
Definition: AreaDefines.h:88
@ AREA_SILITHUS
Definition: AreaDefines.h:78
@ AREA_ICECROWN_CITADEL
Definition: AreaDefines.h:172
@ AREA_ARATHI_BASIN
Definition: AreaDefines.h:92
@ AREA_EASTERN_PLAGUELANDS
Definition: AreaDefines.h:52
@ AREA_DUN_MOROGH
Definition: AreaDefines.h:25
@ AREA_STORMWIND_CITY
Definition: AreaDefines.h:80
@ AREA_THE_CULLING_OF_STRATHOLME
Definition: AreaDefines.h:139
@ AREA_NAGRAND_ARENA
Definition: AreaDefines.h:114
@ AREA_SHATTRATH_CITY
Definition: AreaDefines.h:116
@ AREA_EYE_OF_THE_STORM
Definition: AreaDefines.h:129
@ AREA_ALTERAC_VALLEY
Definition: AreaDefines.h:89
@ AREA_BLADES_EDGE_ARENA
Definition: AreaDefines.h:115
@ AREA_ULDUAR
Definition: AreaDefines.h:145
@ AREA_ISLE_OF_CONQUEST
Definition: AreaDefines.h:171
@ AREA_DALARAN_ARENA
Definition: AreaDefines.h:147
@ AREA_SEARING_GORGE
Definition: AreaDefines.h:43
@ AREA_ELWYNN_FOREST
Definition: AreaDefines.h:31
@ AREA_ZANGARMARSH
Definition: AreaDefines.h:101
@ AREA_THE_OCULUS
Definition: AreaDefines.h:144
@ AREA_TEROKKAR_FOREST
Definition: AreaDefines.h:99
@ OUTDOOR_PVP_SI
Definition: OutdoorPvP.h:34
@ OUTDOOR_PVP_TF
Definition: OutdoorPvP.h:32
@ OUTDOOR_PVP_ZM
Definition: OutdoorPvP.h:33
@ OUTDOOR_PVP_EP
Definition: OutdoorPvP.h:35
@ OUTDOOR_PVP_NA
Definition: OutdoorPvP.h:31
@ OUTDOOR_PVP_HP
Definition: OutdoorPvP.h:30
@ WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_N
Definition: WorldStateDefines.h:427
@ WORLD_STATE_OPVP_EP_UNK_1
Definition: WorldStateDefines.h:388
@ WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_SHOW
Definition: WorldStateDefines.h:215
@ WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS
Definition: WorldStateDefines.h:32
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_CONTROLLED_HORDE
Definition: WorldStateDefines.h:184
@ WORLD_STATE_OPVP_HP_UI_TOWER_DISPLAY_H
Definition: WorldStateDefines.h:412
@ WORLD_STATE_BATTLEGROUND_SA_TIMER_MINUTES
Definition: WorldStateDefines.h:304
@ WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_DISPLAY
Definition: WorldStateDefines.h:384
@ WORLD_STATE_OPVP_NA_UI_GUARDS_LEFT
Definition: WorldStateDefines.h:474
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_H
Definition: WorldStateDefines.h:482
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_ALLIANCE
Definition: WorldStateDefines.h:202
@ WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_H_A
Definition: WorldStateDefines.h:107
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_ALLIANCE
Definition: WorldStateDefines.h:198
@ WORLD_STATE_AHNQIRAJ_SANDWORM_S
Definition: WorldStateDefines.h:510
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_ASSAULTED
Definition: WorldStateDefines.h:153
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONFLICT
Definition: WorldStateDefines.h:231
@ WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS
Definition: WorldStateDefines.h:29
@ WORLD_STATE_BATTLEGROUND_SA_LEFT_ATTACK_TOKEN_ALLIANCE
Definition: WorldStateDefines.h:314
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_NEU_H
Definition: WorldStateDefines.h:498
@ WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_N
Definition: WorldStateDefines.h:431
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONTROL
Definition: WorldStateDefines.h:228
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_UNCONTROL
Definition: WorldStateDefines.h:224
@ WORLD_STATE_BATTLEGROUND_AV_DUNS_CONTROLLED
Definition: WorldStateDefines.h:126
@ WORLD_STATE_BATTLEGROUND_SA_RED_GATE
Definition: WorldStateDefines.h:311
@ WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_N
Definition: WorldStateDefines.h:403
@ WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N
Definition: WorldStateDefines.h:365
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_POS_E
Definition: WorldStateDefines.h:420
@ WORLD_STATE_BATTLEGROUND_SA_TIMER_SECONDS_SECOND_DIGIT
Definition: WorldStateDefines.h:306
@ WORLD_STATE_BATTLEGROUND_SA_PURPLE_GATE
Definition: WorldStateDefines.h:310
@ WORLD_STATE_AHNQIRAJ_SANDWORM_E
Definition: WorldStateDefines.h:512
@ WORLD_STATE_BATTLEGROUND_SA_YELLOW_GATE
Definition: WorldStateDefines.h:326
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_A_A
Definition: WorldStateDefines.h:118
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_DESTROYED
Definition: WorldStateDefines.h:133
@ WORLD_STATE_BATTLEGROUND_AB_RESOURCES_ALLIANCE
Definition: WorldStateDefines.h:189
@ WORLD_STATE_ULDUAR_ALGALON_TIMER_ENABLED
Definition: WorldStateDefines.h:567
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_CONTROLLED_ALLIANCE
Definition: WorldStateDefines.h:196
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_UNCONTROL
Definition: WorldStateDefines.h:221
@ WORLD_STATE_BATTLEGROUND_AV_AID_H_A
Definition: WorldStateDefines.h:99
@ WORLD_STATE_BATTLEGROUND_IC_REFINERY_UNCONTROLLED
Definition: WorldStateDefines.h:274
@ WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_N
Definition: WorldStateDefines.h:452
@ WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_H
Definition: WorldStateDefines.h:426
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SOLDIERS_ENABLE
Definition: WorldStateDefines.h:517
@ WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N_A
Definition: WorldStateDefines.h:375
@ WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_ALLIANCE_CONTROL
Definition: WorldStateDefines.h:219
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_HORDE
Definition: WorldStateDefines.h:203
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_UNCONTROL
Definition: WorldStateDefines.h:227
@ WORLD_STATE_OPVP_HP_BROKENHILL_A
Definition: WorldStateDefines.h:409
@ WORLD_STATE_BATTLEGROUND_SA_CENTER_GY_ALLIANCE
Definition: WorldStateDefines.h:325
@ WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_HORDE
Definition: WorldStateDefines.h:186
@ WORLD_STATE_BATTLEGROUND_NA_ARENA_GREEN
Definition: WorldStateDefines.h:338
@ WORLD_STATE_OPVP_TF_TOWER_NUM_10
Definition: WorldStateDefines.h:465
@ WORLD_STATE_BATTLEGROUND_AV_STONEHEART_H_C
Definition: WorldStateDefines.h:92
@ WORLD_STATE_BATTLEGROUND_AV_STONEH_ASSAULTED
Definition: WorldStateDefines.h:146
@ WORLD_STATE_BATTLEGROUND_AV_UNK_4
Definition: WorldStateDefines.h:156
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_A_C
Definition: WorldStateDefines.h:108
@ WORLD_STATE_BATTLEGROUND_SA_ENABLE_TIMER
Definition: WorldStateDefines.h:307
@ WORLD_STATE_BATTLEGROUND_AV_DUNS_ASSAULTED
Definition: WorldStateDefines.h:143
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_EVENT_BEGIN_ENABLE
Definition: WorldStateDefines.h:520
@ WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_AMOUNT
Definition: WorldStateDefines.h:562
@ WORLD_STATE_BATTLEGROUND_EY_FLAG
Definition: WorldStateDefines.h:244
@ WORLD_STATE_BATTLEGROUND_EY_ALLIANCE_RESOURCES
Definition: WorldStateDefines.h:240
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_ICON
Definition: WorldStateDefines.h:208
@ WORLD_STATE_BATTLEGROUND_BE_ARENA_GOLD
Definition: WorldStateDefines.h:332
@ WORLD_STATE_OPVP_TF_UI_TOWERS_CONTROLLED_DISPLAY
Definition: WorldStateDefines.h:448
@ WORLD_STATE_BATTLEGROUND_AV_S_MINE_N
Definition: WorldStateDefines.h:122
@ WORLD_STATE_OPVP_TF_TOWER_NUM_05
Definition: WorldStateDefines.h:459
@ WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_CONTROLLED_HORDE
Definition: WorldStateDefines.h:188
@ WORLD_STATE_OPVP_ZM_MAP_HORDE_FLAG_READY
Definition: WorldStateDefines.h:441
@ WORLD_STATE_BATTLEGROUND_AV_AID_H_C
Definition: WorldStateDefines.h:98
@ WORLD_STATE_BATTLEGROUND_EY_UNK_2
Definition: WorldStateDefines.h:238
@ WORLD_STATE_OPVP_EP_UNK_3
Definition: WorldStateDefines.h:390
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_NEU_A
Definition: WorldStateDefines.h:492
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_CONTROLLED_HORDE
Definition: WorldStateDefines.h:197
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_H_A
Definition: WorldStateDefines.h:119
@ WORLD_STATE_OPVP_NA_UI_HORDE_GUARDS_SHOW
Definition: WorldStateDefines.h:480
@ WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES
Definition: WorldStateDefines.h:30
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_A
Definition: WorldStateDefines.h:486
@ WORLD_STATE_BATTLEGROUND_WS_UNK_0
Definition: WorldStateDefines.h:169
@ WORLD_STATE_BATTLEGROUND_SA_HORDE_ATTACKER
Definition: WorldStateDefines.h:308
@ WORLD_STATE_BATTLEGROUND_SA_RIGHT_ATTACK_TOKEN_HORDE
Definition: WorldStateDefines.h:316
@ WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_H_WS_OPEN
Definition: WorldStateDefines.h:284
@ WORLD_STATE_BATTLEGROUND_AV_N_MINE_N
Definition: WorldStateDefines.h:125
@ WORLD_STATE_OPVP_EP_UNK_0
Definition: WorldStateDefines.h:387
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_A_C
Definition: WorldStateDefines.h:112
@ WORLD_STATE_OPVP_TF_TOWER_NUM_04
Definition: WorldStateDefines.h:458
@ WORLD_STATE_OPVP_SI_SILITHYST_MAX
Definition: WorldStateDefines.h:359
@ WORLD_STATE_OPVP_HP_OVERLOOK_N
Definition: WorldStateDefines.h:408
@ WORLD_STATE_BATTLEGROUND_IC_HORDE_KEEP_CONTROLLED_H
Definition: WorldStateDefines.h:297
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_H
Definition: WorldStateDefines.h:487
@ WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_REMAINING
Definition: WorldStateDefines.h:551
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_H
Definition: WorldStateDefines.h:429
@ WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_N
Definition: WorldStateDefines.h:424
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_UNUSED
Definition: WorldStateDefines.h:160
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_DISPLAY_E
Definition: WorldStateDefines.h:419
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N_A
Definition: WorldStateDefines.h:373
@ WORLD_STATE_BATTLEGROUND_AV_DUNN_DESTROYED
Definition: WorldStateDefines.h:136
@ WORLD_STATE_BATTLEGROUND_EY_ALLIANCE_BASE
Definition: WorldStateDefines.h:242
@ WORLD_STATE_OPVP_TF_TOWER_NUM_12
Definition: WorldStateDefines.h:467
@ WORLD_STATE_BATTLEGROUND_AV_UNK_1
Definition: WorldStateDefines.h:91
@ WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER
Definition: WorldStateDefines.h:566
@ WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_MINUTES_SECOND_DIGIT
Definition: WorldStateDefines.h:446
@ WORLD_STATE_AHNQIRAJ_SANDWORM_N
Definition: WorldStateDefines.h:509
@ WORLD_STATE_BATTLEGROUND_AB_RESOURCES_WARNING
Definition: WorldStateDefines.h:212
@ WORLD_STATE_OPVP_TF_TOWER_NUM_00
Definition: WorldStateDefines.h:454
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_CONTROLLED
Definition: WorldStateDefines.h:147
@ WORLD_STATE_BATTLEGROUND_AV_UNK_2
Definition: WorldStateDefines.h:134
@ WORLD_STATE_BATTLEGROUND_EY_UNK_3
Definition: WorldStateDefines.h:239
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONTROL
Definition: WorldStateDefines.h:229
@ WORLD_STATE_BATTLEGROUND_AV_ICEWING_ASSAULTED
Definition: WorldStateDefines.h:145
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_H_A
Definition: WorldStateDefines.h:103
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_H_A
Definition: WorldStateDefines.h:111
@ WORLD_STATE_BATTLEGROUND_AV_DUNN_ASSAULTED
Definition: WorldStateDefines.h:144
@ WORLD_STATE_BATTLEGROUND_AV_STONEH_CONTROLLED
Definition: WorldStateDefines.h:129
@ WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_HOURS
Definition: WorldStateDefines.h:445
@ WORLD_STATE_VIOLET_HOLD_SHOW
Definition: WorldStateDefines.h:572
@ WORLD_STATE_BATTLEGROUND_AV_STORMPIKE_COMMANDERS
Definition: WorldStateDefines.h:89
@ WORLD_STATE_BATTLEGROUND_IC_WORKSHOP_UNCONTROLLED
Definition: WorldStateDefines.h:258
@ WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_ALLIANCE
Definition: WorldStateDefines.h:324
@ WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_ALLIANCE
Definition: WorldStateDefines.h:323
@ WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_MAX
Definition: WorldStateDefines.h:552
@ WORLD_STATE_BATTLEGROUND_SA_LEFT_ATTACK_TOKEN_HORDE
Definition: WorldStateDefines.h:317
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_NEU_A
Definition: WorldStateDefines.h:484
@ WORLD_STATE_BATTLEGROUND_AV_STONEHEART_A_C
Definition: WorldStateDefines.h:93
@ WORLD_STATE_BATTLEGROUND_IC_HANGAR_UNCONTROLLED
Definition: WorldStateDefines.h:259
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N_H
Definition: WorldStateDefines.h:374
@ WORLD_STATE_BATTLEGROUND_AV_DUNS_UNUSED
Definition: WorldStateDefines.h:140
@ WORLD_STATE_BATTLEGROUND_IC_GATE_EAST_H_WS_OPEN
Definition: WorldStateDefines.h:282
@ WORLD_STATE_BATTLEGROUND_AB_OCCUPIED_BASES_ALLIANCE
Definition: WorldStateDefines.h:192
@ WORLD_STATE_BATTLEGROUND_WS_UNK_1
Definition: WorldStateDefines.h:170
@ WORLD_STATE_BATTLEGROUND_AV_DUNN_UNUSED
Definition: WorldStateDefines.h:139
@ WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_HORDE_CONTROL
Definition: WorldStateDefines.h:220
@ WORLD_STATE_CULLING_OF_STRATHOLME_CRATES_REVEALED
Definition: WorldStateDefines.h:556
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_A_C
Definition: WorldStateDefines.h:100
@ WORLD_STATE_BATTLEGROUND_SA_BLUE_GATE
Definition: WorldStateDefines.h:312
@ WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_ASSAULTED
Definition: WorldStateDefines.h:154
@ WORLD_STATE_BATTLEGROUND_DS_ARENA_SHOW
Definition: WorldStateDefines.h:349
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N_H
Definition: WorldStateDefines.h:381
@ WORLD_STATE_BATTLEGROUND_AV_ICEWING_CONTROLLED
Definition: WorldStateDefines.h:128
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_UNUSED
Definition: WorldStateDefines.h:157
@ WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_A
Definition: WorldStateDefines.h:404
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_HORDE
Definition: WorldStateDefines.h:182
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_H
Definition: WorldStateDefines.h:435
@ WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_POS
Definition: WorldStateDefines.h:476
@ WORLD_STATE_BATTLEGROUND_RV_ARENA_SHOW
Definition: WorldStateDefines.h:354
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_H_C
Definition: WorldStateDefines.h:101
@ WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_DISPLAY
Definition: WorldStateDefines.h:401
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_CONTROLLED_HORDE
Definition: WorldStateDefines.h:201
@ WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_HORDE
Definition: WorldStateDefines.h:320
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_A
Definition: WorldStateDefines.h:370
@ WORLD_STATE_OPVP_TF_TOWER_NUM_11
Definition: WorldStateDefines.h:466
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_CONTROLLED
Definition: WorldStateDefines.h:148
@ WORLD_STATE_ICECROWN_CITADEL_EXECUTION_TIME
Definition: WorldStateDefines.h:549
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_A_A
Definition: WorldStateDefines.h:110
@ WORLD_STATE_BATTLEGROUND_RL_ARENA_GREEN
Definition: WorldStateDefines.h:343
@ WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_POS
Definition: WorldStateDefines.h:385
@ WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_CONTROLLED_ALLIANCE
Definition: WorldStateDefines.h:187
@ WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TOGGLE
Definition: WorldStateDefines.h:545
@ WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_H_WS_CLOSED
Definition: WorldStateDefines.h:279
@ WORLD_STATE_SCOURGE_INVASION_TANARIS
Definition: WorldStateDefines.h:31
@ WORLD_STATE_OPVP_HP_STADIUM_H
Definition: WorldStateDefines.h:398
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_A_A
Definition: WorldStateDefines.h:102
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_H_C
Definition: WorldStateDefines.h:113
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_HORDE
Definition: WorldStateDefines.h:175
@ WORLD_STATE_BATTLEGROUND_AV_DUNN_CONTROLLED
Definition: WorldStateDefines.h:127
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_DESTROYED
Definition: WorldStateDefines.h:131
@ WORLD_STATE_BATTLEGROUND_AB_RESOURCES_MAX
Definition: WorldStateDefines.h:193
@ WORLD_STATE_OPVP_HP_STADIUM_N
Definition: WorldStateDefines.h:400
@ WORLD_STATE_BATTLEGROUND_EY_UNK_1
Definition: WorldStateDefines.h:237
@ WORLD_STATE_BATTLEGROUND_AV_STORMPIKE_LIEUTENANTS
Definition: WorldStateDefines.h:88
@ WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_A
Definition: WorldStateDefines.h:425
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONFLICT
Definition: WorldStateDefines.h:230
@ WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_A
Definition: WorldStateDefines.h:362
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONFLICT
Definition: WorldStateDefines.h:233
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_DEFENDERS_COUNT
Definition: WorldStateDefines.h:515
@ WORLD_STATE_BATTLEGROUND_EY_HORDE_BASE
Definition: WorldStateDefines.h:243
@ WORLD_STATE_OPVP_EP_UNK_5
Definition: WorldStateDefines.h:392
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_H
Definition: WorldStateDefines.h:369
@ WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_A
Definition: WorldStateDefines.h:496
@ WORLD_STATE_BATTLEGROUND_IC_ALLIANCE_REINFORCEMENT
Definition: WorldStateDefines.h:251
@ WORLD_STATE_OPVP_SI_GATHERED_H
Definition: WorldStateDefines.h:358
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N_A
Definition: WorldStateDefines.h:380
@ WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_READY
Definition: WorldStateDefines.h:438
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_ALLIANCE
Definition: WorldStateDefines.h:172
@ WORLD_STATE_BATTLEGROUND_AV_UNK_0
Definition: WorldStateDefines.h:90
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_NEU_A
Definition: WorldStateDefines.h:481
@ WORLD_STATE_OPVP_ZM_MAP_HORDE_FLAG_NOT_READY
Definition: WorldStateDefines.h:440
@ WORLD_STATE_BATTLEGROUND_AV_AID_A_A
Definition: WorldStateDefines.h:97
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_NEU_A
Definition: WorldStateDefines.h:489
@ WORLD_STATE_BATTLEGROUND_EY_UNK_0
Definition: WorldStateDefines.h:236
@ WORLD_STATE_BATTLEGROUND_SA_GREEN_GATE
Definition: WorldStateDefines.h:313
@ WORLD_STATE_OPVP_TF_TOWER_NUM_09
Definition: WorldStateDefines.h:464
@ WORLD_STATE_BATTLEGROUND_NA_ARENA_SHOW
Definition: WorldStateDefines.h:339
@ WORLD_STATE_OPVP_TF_TOWER_NUM_13
Definition: WorldStateDefines.h:468
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_A
Definition: WorldStateDefines.h:434
@ WORLD_STATE_BATTLEGROUND_AV_STONEH_DESTROYED
Definition: WorldStateDefines.h:138
@ WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN
Definition: WorldStateDefines.h:558
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_ICON
Definition: WorldStateDefines.h:207
@ WORLD_STATE_BATTLEGROUND_RV_ARENA_GREEN
Definition: WorldStateDefines.h:352
@ WORLD_STATE_BATTLEGROUND_AV_N_MINE_A
Definition: WorldStateDefines.h:123
@ WORLD_STATE_OPVP_TF_TOWER_NUM_08
Definition: WorldStateDefines.h:463
@ WORLD_STATE_OPVP_TF_TOWER_NUM_06
Definition: WorldStateDefines.h:461
@ WORLD_STATE_BATTLEGROUND_AB_RESOURCES_HORDE
Definition: WorldStateDefines.h:190
@ WORLD_STATE_BATTLEGROUND_IC_HORDE_REINFORCEMENT
Definition: WorldStateDefines.h:252
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONFLICT
Definition: WorldStateDefines.h:232
@ WORLD_STATE_BATTLEGROUND_AV_STONEHEART_H_A
Definition: WorldStateDefines.h:94
@ WORLD_STATE_BATTLEGROUND_AB_FARM_ICON
Definition: WorldStateDefines.h:209
@ WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_HORDE
Definition: WorldStateDefines.h:471
@ WORLD_STATE_SCOURGE_INVASION_WINTERSPRING
Definition: WorldStateDefines.h:27
@ WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_CONTROLLED
Definition: WorldStateDefines.h:149
@ WORLD_STATE_BATTLEGROUND_WS_UNK_2
Definition: WorldStateDefines.h:171
@ WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_HORDE
Definition: WorldStateDefines.h:321
@ WORLD_STATE_OPVP_NA_MAP_HALAA_ALLIANCE
Definition: WorldStateDefines.h:495
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_CONTROLLED_ALLIANCE
Definition: WorldStateDefines.h:183
@ WORLD_STATE_BATTLEGROUND_IC_GATE_EAST_A_WS_OPEN
Definition: WorldStateDefines.h:287
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_NEU_H
Definition: WorldStateDefines.h:499
@ WORLD_STATE_OPVP_HP_BROKENHILL_N
Definition: WorldStateDefines.h:411
@ WORLD_STATE_BATTLEGROUND_IC_GATE_WEST_H_WS_OPEN
Definition: WorldStateDefines.h:283
@ WORLD_STATE_ICECROWN_CITADEL_SHOW_ATTEMPTS
Definition: WorldStateDefines.h:550
@ WORLD_STATE_OPVP_HP_UI_TOWER_DISPLAY_A
Definition: WorldStateDefines.h:413
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_ASSAULTED
Definition: WorldStateDefines.h:152
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_TIME
Definition: WorldStateDefines.h:519
@ WORLD_STATE_BATTLEGROUND_AV_S_MINE_H
Definition: WorldStateDefines.h:121
@ WORLD_STATE_BATTLEGROUND_SA_RIGHT_ATTACK_TOKEN_ALLIANCE
Definition: WorldStateDefines.h:315
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N
Definition: WorldStateDefines.h:364
@ WORLD_STATE_BATTLEGROUND_AV_STONEHEART_A_A
Definition: WorldStateDefines.h:95
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_H
Definition: WorldStateDefines.h:383
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_N_E
Definition: WorldStateDefines.h:421
@ WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_ALLIANCE
Definition: WorldStateDefines.h:470
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_A
Definition: WorldStateDefines.h:491
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_HORDE
Definition: WorldStateDefines.h:199
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_H
Definition: WorldStateDefines.h:485
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_N
Definition: WorldStateDefines.h:430
@ WORLD_STATE_OPVP_TF_TOWER_NUM_03
Definition: WorldStateDefines.h:457
@ WORLD_STATE_OPVP_EP_UNK_8
Definition: WorldStateDefines.h:395
@ WORLD_STATE_BATTLEGROUND_SA_CENTER_GY_HORDE
Definition: WorldStateDefines.h:322
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_CONTROLLED_HORDE
Definition: WorldStateDefines.h:205
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_H_C
Definition: WorldStateDefines.h:109
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_CONTROLLED
Definition: WorldStateDefines.h:150
@ WORLD_STATE_CULLING_OF_STRATHOLME_SHOW_CRATES
Definition: WorldStateDefines.h:555
@ WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_A
Definition: WorldStateDefines.h:376
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONTROL
Definition: WorldStateDefines.h:222
@ WORLD_STATE_OPVP_EP_UNK_6
Definition: WorldStateDefines.h:393
@ WORLD_STATE_OPVP_HP_OVERLOOK_H
Definition: WorldStateDefines.h:407
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_A_A
Definition: WorldStateDefines.h:114
@ WORLD_STATE_CULLING_OF_STRATHOLME_WAVE_COUNT
Definition: WorldStateDefines.h:557
@ WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_NOT_READY
Definition: WorldStateDefines.h:439
@ WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_MINUTES_FIRST_DIGIT
Definition: WorldStateDefines.h:447
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_UNUSED
Definition: WorldStateDefines.h:158
@ WORLD_STATE_BATTLEGROUND_SA_TIMER_SECONDS_FIRST_DIGIT
Definition: WorldStateDefines.h:305
@ WORLD_STATE_OPVP_NA_UI_SLIDER_N
Definition: WorldStateDefines.h:478
@ WORLD_STATE_BATTLEGROUND_AV_ICEWING_DESTROYED
Definition: WorldStateDefines.h:137
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONFLICT
Definition: WorldStateDefines.h:235
@ WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_H
Definition: WorldStateDefines.h:377
@ WORLD_STATE_BATTLEGROUND_EY_FLAG_STATE_HORDE
Definition: WorldStateDefines.h:246
@ WORLD_STATE_HALLS_OF_REFLECTION_WAVES_ENABLED
Definition: WorldStateDefines.h:576
@ WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_A_WS_OPEN
Definition: WorldStateDefines.h:285
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_N
Definition: WorldStateDefines.h:436
@ WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_DISPLAY
Definition: WorldStateDefines.h:451
@ WORLD_STATE_BATTLEGROUND_RL_ARENA_SHOW
Definition: WorldStateDefines.h:344
@ WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_DISPLAY
Definition: WorldStateDefines.h:477
@ WORLD_STATE_OPVP_TF_TOWER_NUM_01
Definition: WorldStateDefines.h:455
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_DESTROYED
Definition: WorldStateDefines.h:130
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_N
Definition: WorldStateDefines.h:372
@ WORLD_STATE_BATTLEGROUND_AV_UNK_5
Definition: WorldStateDefines.h:161
@ WORLD_STATE_OPVP_ZM_UNK
Definition: WorldStateDefines.h:437
@ WORLD_STATE_BATTLEGROUND_AV_AID_A_C
Definition: WorldStateDefines.h:96
@ WORLD_STATE_AHNQIRAJ_SANDWORM_SW
Definition: WorldStateDefines.h:511
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_NEU_H
Definition: WorldStateDefines.h:500
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_DISPLAY_W
Definition: WorldStateDefines.h:416
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_ALLIANCE
Definition: WorldStateDefines.h:176
@ WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_UNUSED
Definition: WorldStateDefines.h:159
@ WORLD_STATE_BATTLEGROUND_AV_DUNS_DESTROYED
Definition: WorldStateDefines.h:135
@ WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_A_C
Definition: WorldStateDefines.h:104
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_POS_W
Definition: WorldStateDefines.h:417
@ WORLD_STATE_OPVP_NA_UI_GUARDS_MAX
Definition: WorldStateDefines.h:475
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_ASSAULTED
Definition: WorldStateDefines.h:155
@ WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_POS
Definition: WorldStateDefines.h:453
@ WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_A
Definition: WorldStateDefines.h:449
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_H_A
Definition: WorldStateDefines.h:115
@ WORLD_STATE_OPVP_TF_TOWER_NUM_07
Definition: WorldStateDefines.h:462
@ WORLD_STATE_BATTLEGROUND_AV_ICEWING_UNUSED
Definition: WorldStateDefines.h:141
@ WORLD_STATE_BATTLEGROUND_AV_STONEH_UNUSED
Definition: WorldStateDefines.h:142
@ WORLD_STATE_VIOLET_HOLD_WAVE_COUNT
Definition: WorldStateDefines.h:570
@ WORLD_STATE_BATTLEGROUND_IC_ALLIANCE_REINFORCEMENT_SET
Definition: WorldStateDefines.h:249
@ WORLD_STATE_ARENA_SEASON_PROGRESS
Definition: WorldStateDefines.h:43
@ WORLD_STATE_OPVP_NA_MAP_HALAA_NEUTRAL
Definition: WorldStateDefines.h:493
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_ICON
Definition: WorldStateDefines.h:206
@ WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_ALLIANCE
Definition: WorldStateDefines.h:185
@ WORLD_STATE_BATTLEGROUND_SA_BONUS_TIMER
Definition: WorldStateDefines.h:309
@ WORLD_STATE_OPVP_TF_TOWER_NUM_14
Definition: WorldStateDefines.h:469
@ WORLD_STATE_BATTLEGROUND_AV_N_MINE_H
Definition: WorldStateDefines.h:124
@ WORLD_STATE_BATTLEGROUND_RV_ARENA_GOLD
Definition: WorldStateDefines.h:353
@ WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_POS
Definition: WorldStateDefines.h:402
@ WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_H_C
Definition: WorldStateDefines.h:105
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N
Definition: WorldStateDefines.h:368
@ WORLD_STATE_OPVP_HP_STADIUM_A
Definition: WorldStateDefines.h:399
@ WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_DESTROYED
Definition: WorldStateDefines.h:132
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_A
Definition: WorldStateDefines.h:382
@ WORLD_STATE_OPVP_HP_BROKENHILL_H
Definition: WorldStateDefines.h:410
@ WORLD_STATE_BATTLEGROUND_BE_ARENA_GREEN
Definition: WorldStateDefines.h:333
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_NEU_H
Definition: WorldStateDefines.h:501
@ WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_STATUS
Definition: WorldStateDefines.h:216
@ WORLD_STATE_OPVP_NA_MAP_HALAA_HORDE
Definition: WorldStateDefines.h:494
@ WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TWILIGHT
Definition: WorldStateDefines.h:544
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_ICON
Definition: WorldStateDefines.h:210
@ WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_N
Definition: WorldStateDefines.h:386
@ WORLD_STATE_HALLS_OF_REFLECTION_WAVE_COUNT
Definition: WorldStateDefines.h:575
@ WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_H
Definition: WorldStateDefines.h:497
@ WORLD_STATE_BATTLEGROUND_AV_S_MINE_A
Definition: WorldStateDefines.h:120
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_N
Definition: WorldStateDefines.h:162
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONFLICT
Definition: WorldStateDefines.h:234
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_ALLIANCE
Definition: WorldStateDefines.h:181
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_HORDE
Definition: WorldStateDefines.h:173
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_H_C
Definition: WorldStateDefines.h:117
@ WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_SHOW
Definition: WorldStateDefines.h:563
@ WORLD_STATE_BATTLEGROUND_SA_ALLIANCE_DEFENSE_TOKEN
Definition: WorldStateDefines.h:318
@ WORLD_STATE_OPVP_EP_UNK_2
Definition: WorldStateDefines.h:389
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_HORDE
Definition: WorldStateDefines.h:195
@ WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_A
Definition: WorldStateDefines.h:422
@ WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_H
Definition: WorldStateDefines.h:405
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_A
Definition: WorldStateDefines.h:428
@ WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_H
Definition: WorldStateDefines.h:450
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_N_W
Definition: WorldStateDefines.h:418
@ WORLD_STATE_BATTLEGROUND_AB_OCCUPIED_BASES_HORDE
Definition: WorldStateDefines.h:191
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_CONTROLLED_ALLIANCE
Definition: WorldStateDefines.h:204
@ WORLD_STATE_ARENA_SEASON_ID
Definition: WorldStateDefines.h:46
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_ENABLE
Definition: WorldStateDefines.h:518
@ WORLD_STATE_BATTLEGROUND_SA_HORDE_DEFENSE_TOKEN
Definition: WorldStateDefines.h:319
@ WORLD_STATE_OPVP_TF_TOWER_NUM_15
Definition: WorldStateDefines.h:460
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONTROL
Definition: WorldStateDefines.h:226
@ WORLD_STATE_BATTLEGROUND_BE_ARENA_SHOW
Definition: WorldStateDefines.h:334
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_MAX
Definition: WorldStateDefines.h:174
@ WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_MATERIAL
Definition: WorldStateDefines.h:543
@ WORLD_STATE_OPVP_HP_OVERLOOK_A
Definition: WorldStateDefines.h:406
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_A_C
Definition: WorldStateDefines.h:116
@ WORLD_STATE_BATTLEGROUND_RL_ARENA_GOLD
Definition: WorldStateDefines.h:342
@ WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_H
Definition: WorldStateDefines.h:423
@ WORLD_STATE_BATTLEGROUND_EY_HORDE_RESOURCES
Definition: WorldStateDefines.h:241
@ WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_H
Definition: WorldStateDefines.h:433
@ WORLD_STATE_BATTLEGROUND_IC_UNK
Definition: WorldStateDefines.h:256
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONTROL
Definition: WorldStateDefines.h:225
@ WORLD_STATE_BATTLEGROUND_IC_GATE_WEST_A_WS_OPEN
Definition: WorldStateDefines.h:286
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_A
Definition: WorldStateDefines.h:483
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SCOURGE_COUNT
Definition: WorldStateDefines.h:516
@ WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_UNCONTROL
Definition: WorldStateDefines.h:218
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_A
Definition: WorldStateDefines.h:378
@ WORLD_STATE_BATTLEGROUND_IC_QUARRY_UNCONTROLLED
Definition: WorldStateDefines.h:269
@ WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_A
Definition: WorldStateDefines.h:432
@ WORLD_STATE_SCOURGE_INVASION_AZSHARA
Definition: WorldStateDefines.h:28
@ WORLD_STATE_BATTLEGROUND_EY_FLAG_STATE_ALLIANCE
Definition: WorldStateDefines.h:245
@ WORLD_STATE_BATTLEGROUND_DS_ARENA_GOLD
Definition: WorldStateDefines.h:348
@ WORLD_STATE_VIOLET_HOLD_PRISON_STATE
Definition: WorldStateDefines.h:571
@ WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_NEUTRAL
Definition: WorldStateDefines.h:444
@ WORLD_STATE_OPVP_SI_GATHERED_A
Definition: WorldStateDefines.h:357
@ WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_PERCENT_GREY
Definition: WorldStateDefines.h:217
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONTROL
Definition: WorldStateDefines.h:223
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_A
Definition: WorldStateDefines.h:367
@ WORLD_STATE_ICECROWN_CITADEL_SHOW_TIMER
Definition: WorldStateDefines.h:548
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_H
Definition: WorldStateDefines.h:379
@ WORLD_STATE_BATTLEGROUND_IC_DOCKS_UNCONTROLLED
Definition: WorldStateDefines.h:264
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_CONTROLLED_ALLIANCE
Definition: WorldStateDefines.h:200
@ WORLD_STATE_BATTLEGROUND_NA_ARENA_GOLD
Definition: WorldStateDefines.h:337
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_A
Definition: WorldStateDefines.h:488
@ WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN_SHOW
Definition: WorldStateDefines.h:559
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_ALLIANCE
Definition: WorldStateDefines.h:194
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_H
Definition: WorldStateDefines.h:371
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_H
Definition: WorldStateDefines.h:490
@ WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_A_A
Definition: WorldStateDefines.h:106
@ WORLD_STATE_BATTLEGROUND_DS_ARENA_GREEN
Definition: WorldStateDefines.h:347
@ WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_H
Definition: WorldStateDefines.h:363
@ WORLD_STATE_BATTLEGROUND_AB_UNK
Definition: WorldStateDefines.h:211
@ WORLD_STATE_OPVP_NA_UI_ALLIANCE_GUARDS_SHOW
Definition: WorldStateDefines.h:479
@ WORLD_STATE_OPVP_TF_TOWER_NUM_02
Definition: WorldStateDefines.h:456
@ WORLD_STATE_BATTLEGROUND_SA_ANCIENT_GATE
Definition: WorldStateDefines.h:327
@ WORLD_STATE_OPVP_EP_UNK_7
Definition: WorldStateDefines.h:394
@ WORLD_STATE_BATTLEGROUND_AV_UNK_3
Definition: WorldStateDefines.h:151
@ WORLD_STATE_BATTLEGROUND_IC_HORDE_REINFORCEMENT_SET
Definition: WorldStateDefines.h:250
@ ARENA_SEASON_STATE_IN_PROGRESS
Definition: ArenaSeasonMgr.h:29
#define sArenaSeasonMgr
Definition: ArenaSeasonMgr.h:124
@ BATTLEFIELD_WG
Definition: Battlefield.h:29
@ BATTLEGROUND_IC
Definition: SharedDefines.h:3508
@ BATTLEGROUND_WS
Definition: SharedDefines.h:3498
@ BATTLEGROUND_EY
Definition: SharedDefines.h:3503
@ BATTLEGROUND_AV
Definition: SharedDefines.h:3497
@ BATTLEGROUND_BE
Definition: SharedDefines.h:3501
@ BATTLEGROUND_RV
Definition: SharedDefines.h:3507
@ BATTLEGROUND_NA
Definition: SharedDefines.h:3500
@ BATTLEGROUND_DS
Definition: SharedDefines.h:3506
@ BATTLEGROUND_SA
Definition: SharedDefines.h:3505
@ BATTLEGROUND_AB
Definition: SharedDefines.h:3499
@ BATTLEGROUND_RL
Definition: SharedDefines.h:3504
Definition: CreatureAI.h:70
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &)=0
uint32 GetTypeId()
Definition: Battlefield.h:241
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &)
Definition: Battleground.h:451
BattlegroundTypeId GetBgTypeID(bool GetRandom=false) const
Definition: Battleground.h:320
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1203
void SendBGWeekendWorldStates()
Definition: Player.cpp:8844
void SendBattlefieldWorldStates()
Definition: Player.cpp:8859
static std::unordered_map< int, bgZoneRef > bgZoneIdToFillWorldStates
Definition: Player.h:2627
Definition: InstanceScript.h:143
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &)
Definition: InstanceScript.h:264
Definition: OutdoorPvP.h:186
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &)
Definition: OutdoorPvP.h:203
uint32 GetTypeId() const
Definition: OutdoorPvP.h:238
Definition: WorldStatePackets.h:28
std::vector< WorldStateInfo > Worldstates
Definition: WorldStatePackets.h:46
int32 MapID
Definition: WorldStatePackets.h:42
int32 AreaID
Definition: WorldStatePackets.h:44
WorldPacket const * Write() override
Definition: WorldStatePackets.cpp:22
int32 ZoneID
Definition: WorldStatePackets.h:43

References AREA_ALTERAC_VALLEY, AREA_ARATHI_BASIN, AREA_BLADES_EDGE_ARENA, AREA_DALARAN_ARENA, AREA_DEEPRUN_TRAM, AREA_DUN_MOROGH, AREA_EASTERN_PLAGUELANDS, AREA_ELWYNN_FOREST, AREA_EYE_OF_THE_STORM, AREA_HALLS_OF_REFLECTION, AREA_HELLFIRE_PENINSULA, AREA_ICECROWN_CITADEL, AREA_IRONFORGE, AREA_ISLE_OF_CONQUEST, AREA_LOCH_MODAN, AREA_NAGRAND, AREA_NAGRAND_ARENA, AREA_PLAGUELANDS_THE_SCARLET_ENCLAVE, AREA_RUINS_OF_LORDAERON, AREA_SEARING_GORGE, AREA_SHATTRATH_CITY, AREA_SILITHUS, AREA_STORMWIND_CITY, AREA_STRAND_OF_THE_ANCIENTS, AREA_TEROKKAR_FOREST, AREA_THE_CULLING_OF_STRATHOLME, AREA_THE_OCULUS, AREA_THE_RUBY_SANCTUM, AREA_THE_VIOLET_HOLD, AREA_ULDUAR, AREA_WARSONG_GULCH, AREA_WESTFALL, AREA_WETLANDS, AREA_WINTERGRASP, AREA_ZANGARMARSH, WorldPackets::WorldState::InitWorldStates::AreaID, ARENA_SEASON_STATE_IN_PROGRESS, ARENA_THE_RING_OF_VALOR, BATTLEFIELD_WG, BATTLEGROUND_AB, BATTLEGROUND_AV, BATTLEGROUND_BE, BATTLEGROUND_DS, BATTLEGROUND_EY, BATTLEGROUND_IC, BATTLEGROUND_NA, BATTLEGROUND_RL, BATTLEGROUND_RV, BATTLEGROUND_SA, BATTLEGROUND_WS, bgZoneIdToFillWorldStates, Battleground::FillInitialWorldStates(), InstanceScript::FillInitialWorldStates(), OutdoorPvP::FillInitialWorldStates(), Battlefield::FillInitialWorldStates(), GetBattleground(), Battleground::GetBgTypeID(), ObjectAccessor::GetCreature(), WorldObject::GetInstanceScript(), WorldLocation::GetMapId(), Battlefield::GetTypeId(), OutdoorPvP::GetTypeId(), LOG_DEBUG, MAP_HALLS_OF_REFLECTION, MAP_ICECROWN_CITADEL, MAP_OUTLAND, MAP_THE_CULLING_OF_STRATHOLME, MAP_THE_OCULUS, MAP_ULDUAR, WorldPackets::WorldState::InitWorldStates::MapID, OUTDOOR_PVP_EP, OUTDOOR_PVP_HP, OUTDOOR_PVP_NA, OUTDOOR_PVP_SI, OUTDOOR_PVP_TF, OUTDOOR_PVP_ZM, sArenaSeasonMgr, sBattlefieldMgr, SendBattlefieldWorldStates(), SendBGWeekendWorldStates(), SendDirectMessage(), sOutdoorPvPMgr, sWorldState, WORLD_STATE_AHNQIRAJ_SANDWORM_E, WORLD_STATE_AHNQIRAJ_SANDWORM_N, WORLD_STATE_AHNQIRAJ_SANDWORM_S, WORLD_STATE_AHNQIRAJ_SANDWORM_SW, WORLD_STATE_ARENA_SEASON_ID, WORLD_STATE_ARENA_SEASON_PROGRESS, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_ENABLE, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_TIME, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_DEFENDERS_COUNT, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_EVENT_BEGIN_ENABLE, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SCOURGE_COUNT, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SOLDIERS_ENABLE, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_ICON, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_FARM_ICON, WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_ICON, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_ICON, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_OCCUPIED_BASES_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_OCCUPIED_BASES_HORDE, WORLD_STATE_BATTLEGROUND_AB_RESOURCES_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_RESOURCES_HORDE, WORLD_STATE_BATTLEGROUND_AB_RESOURCES_MAX, WORLD_STATE_BATTLEGROUND_AB_RESOURCES_WARNING, WORLD_STATE_BATTLEGROUND_AB_STABLE_ICON, WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_UNK, WORLD_STATE_BATTLEGROUND_AV_AID_A_A, WORLD_STATE_BATTLEGROUND_AV_AID_A_C, WORLD_STATE_BATTLEGROUND_AV_AID_H_A, WORLD_STATE_BATTLEGROUND_AV_AID_H_C, WORLD_STATE_BATTLEGROUND_AV_DUNN_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_DUNN_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_DUNN_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_DUNN_UNUSED, WORLD_STATE_BATTLEGROUND_AV_DUNS_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_DUNS_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_DUNS_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_DUNS_UNUSED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_A_A, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_A_C, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_H_A, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_H_C, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_UNUSED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_A_A, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_A_C, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_H_A, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_H_C, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_UNUSED, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_A_A, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_A_C, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_H_A, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_H_C, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_UNUSED, WORLD_STATE_BATTLEGROUND_AV_ICEWING_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_ICEWING_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_ICEWING_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_ICEWING_UNUSED, WORLD_STATE_BATTLEGROUND_AV_N_MINE_A, WORLD_STATE_BATTLEGROUND_AV_N_MINE_H, WORLD_STATE_BATTLEGROUND_AV_N_MINE_N, WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_A_A, WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_A_C, WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_H_A, WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_H_C, WORLD_STATE_BATTLEGROUND_AV_S_MINE_A, WORLD_STATE_BATTLEGROUND_AV_S_MINE_H, WORLD_STATE_BATTLEGROUND_AV_S_MINE_N, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_A_A, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_A_C, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_H_A, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_H_C, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_N, WORLD_STATE_BATTLEGROUND_AV_STONEH_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_STONEH_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_STONEH_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_STONEH_UNUSED, WORLD_STATE_BATTLEGROUND_AV_STONEHEART_A_A, WORLD_STATE_BATTLEGROUND_AV_STONEHEART_A_C, WORLD_STATE_BATTLEGROUND_AV_STONEHEART_H_A, WORLD_STATE_BATTLEGROUND_AV_STONEHEART_H_C, WORLD_STATE_BATTLEGROUND_AV_STORMPIKE_COMMANDERS, WORLD_STATE_BATTLEGROUND_AV_STORMPIKE_LIEUTENANTS, WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_UNUSED, WORLD_STATE_BATTLEGROUND_AV_UNK_0, WORLD_STATE_BATTLEGROUND_AV_UNK_1, WORLD_STATE_BATTLEGROUND_AV_UNK_2, WORLD_STATE_BATTLEGROUND_AV_UNK_3, WORLD_STATE_BATTLEGROUND_AV_UNK_4, WORLD_STATE_BATTLEGROUND_AV_UNK_5, WORLD_STATE_BATTLEGROUND_BE_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_BE_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_BE_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_DS_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_DS_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_DS_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_EY_ALLIANCE_BASE, WORLD_STATE_BATTLEGROUND_EY_ALLIANCE_RESOURCES, WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_ALLIANCE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_HORDE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_UNCONTROL, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_UNCONTROL, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_UNCONTROL, WORLD_STATE_BATTLEGROUND_EY_FLAG, WORLD_STATE_BATTLEGROUND_EY_FLAG_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_EY_FLAG_STATE_HORDE, WORLD_STATE_BATTLEGROUND_EY_HORDE_BASE, WORLD_STATE_BATTLEGROUND_EY_HORDE_RESOURCES, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_UNCONTROL, WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_PERCENT_GREY, WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_SHOW, WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_STATUS, WORLD_STATE_BATTLEGROUND_EY_UNK_0, WORLD_STATE_BATTLEGROUND_EY_UNK_1, WORLD_STATE_BATTLEGROUND_EY_UNK_2, WORLD_STATE_BATTLEGROUND_EY_UNK_3, WORLD_STATE_BATTLEGROUND_IC_ALLIANCE_REINFORCEMENT, WORLD_STATE_BATTLEGROUND_IC_ALLIANCE_REINFORCEMENT_SET, WORLD_STATE_BATTLEGROUND_IC_DOCKS_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_IC_GATE_EAST_A_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_EAST_H_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_A_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_H_WS_CLOSED, WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_H_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_WEST_A_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_WEST_H_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_HANGAR_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_IC_HORDE_KEEP_CONTROLLED_H, WORLD_STATE_BATTLEGROUND_IC_HORDE_REINFORCEMENT, WORLD_STATE_BATTLEGROUND_IC_HORDE_REINFORCEMENT_SET, WORLD_STATE_BATTLEGROUND_IC_QUARRY_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_IC_REFINERY_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_IC_UNK, WORLD_STATE_BATTLEGROUND_IC_WORKSHOP_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_NA_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_NA_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_NA_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_RL_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_RL_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_RL_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_RV_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_RV_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_RV_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_SA_ALLIANCE_DEFENSE_TOKEN, WORLD_STATE_BATTLEGROUND_SA_ANCIENT_GATE, WORLD_STATE_BATTLEGROUND_SA_BLUE_GATE, WORLD_STATE_BATTLEGROUND_SA_BONUS_TIMER, WORLD_STATE_BATTLEGROUND_SA_CENTER_GY_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_CENTER_GY_HORDE, WORLD_STATE_BATTLEGROUND_SA_ENABLE_TIMER, WORLD_STATE_BATTLEGROUND_SA_GREEN_GATE, WORLD_STATE_BATTLEGROUND_SA_HORDE_ATTACKER, WORLD_STATE_BATTLEGROUND_SA_HORDE_DEFENSE_TOKEN, WORLD_STATE_BATTLEGROUND_SA_LEFT_ATTACK_TOKEN_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_LEFT_ATTACK_TOKEN_HORDE, WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_HORDE, WORLD_STATE_BATTLEGROUND_SA_PURPLE_GATE, WORLD_STATE_BATTLEGROUND_SA_RED_GATE, WORLD_STATE_BATTLEGROUND_SA_RIGHT_ATTACK_TOKEN_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_RIGHT_ATTACK_TOKEN_HORDE, WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_HORDE, WORLD_STATE_BATTLEGROUND_SA_TIMER_MINUTES, WORLD_STATE_BATTLEGROUND_SA_TIMER_SECONDS_FIRST_DIGIT, WORLD_STATE_BATTLEGROUND_SA_TIMER_SECONDS_SECOND_DIGIT, WORLD_STATE_BATTLEGROUND_SA_YELLOW_GATE, WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_ALLIANCE, WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_HORDE, WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_MAX, WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_HORDE, WORLD_STATE_BATTLEGROUND_WS_UNK_0, WORLD_STATE_BATTLEGROUND_WS_UNK_1, WORLD_STATE_BATTLEGROUND_WS_UNK_2, WORLD_STATE_CULLING_OF_STRATHOLME_CRATES_REVEALED, WORLD_STATE_CULLING_OF_STRATHOLME_SHOW_CRATES, WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN, WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN_SHOW, WORLD_STATE_CULLING_OF_STRATHOLME_WAVE_COUNT, WORLD_STATE_HALLS_OF_REFLECTION_WAVE_COUNT, WORLD_STATE_HALLS_OF_REFLECTION_WAVES_ENABLED, WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_MAX, WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_REMAINING, WORLD_STATE_ICECROWN_CITADEL_EXECUTION_TIME, WORLD_STATE_ICECROWN_CITADEL_SHOW_ATTEMPTS, WORLD_STATE_ICECROWN_CITADEL_SHOW_TIMER, WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_AMOUNT, WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_SHOW, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_A, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_H, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N_A, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N_H, WORLD_STATE_OPVP_EP_EASTWALLTOWER_A, WORLD_STATE_OPVP_EP_EASTWALLTOWER_H, WORLD_STATE_OPVP_EP_EASTWALLTOWER_N, WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_A, WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_H, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_A, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_H, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N_A, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N_H, WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_A, WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_H, WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N, WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N_A, WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_A, WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_H, WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_DISPLAY, WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_N, WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_POS, WORLD_STATE_OPVP_EP_UNK_0, WORLD_STATE_OPVP_EP_UNK_1, WORLD_STATE_OPVP_EP_UNK_2, WORLD_STATE_OPVP_EP_UNK_3, WORLD_STATE_OPVP_EP_UNK_5, WORLD_STATE_OPVP_EP_UNK_6, WORLD_STATE_OPVP_EP_UNK_7, WORLD_STATE_OPVP_EP_UNK_8, WORLD_STATE_OPVP_HP_BROKENHILL_A, WORLD_STATE_OPVP_HP_BROKENHILL_H, WORLD_STATE_OPVP_HP_BROKENHILL_N, WORLD_STATE_OPVP_HP_OVERLOOK_A, WORLD_STATE_OPVP_HP_OVERLOOK_H, WORLD_STATE_OPVP_HP_OVERLOOK_N, WORLD_STATE_OPVP_HP_STADIUM_A, WORLD_STATE_OPVP_HP_STADIUM_H, WORLD_STATE_OPVP_HP_STADIUM_N, WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_A, WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_H, WORLD_STATE_OPVP_HP_UI_TOWER_DISPLAY_A, WORLD_STATE_OPVP_HP_UI_TOWER_DISPLAY_H, WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_DISPLAY, WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_N, WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_POS, WORLD_STATE_OPVP_NA_MAP_HALAA_ALLIANCE, WORLD_STATE_OPVP_NA_MAP_HALAA_HORDE, WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_A, WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_H, WORLD_STATE_OPVP_NA_MAP_HALAA_NEUTRAL, WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_NEU_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_NEU_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_NEU_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_NEU_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_NEU_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_NEU_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_NEU_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_NEU_H, WORLD_STATE_OPVP_NA_UI_ALLIANCE_GUARDS_SHOW, WORLD_STATE_OPVP_NA_UI_GUARDS_LEFT, WORLD_STATE_OPVP_NA_UI_GUARDS_MAX, WORLD_STATE_OPVP_NA_UI_HORDE_GUARDS_SHOW, WORLD_STATE_OPVP_NA_UI_SLIDER_N, WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_DISPLAY, WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_POS, WORLD_STATE_OPVP_SI_GATHERED_A, WORLD_STATE_OPVP_SI_GATHERED_H, WORLD_STATE_OPVP_SI_SILITHYST_MAX, WORLD_STATE_OPVP_TF_TOWER_NUM_00, WORLD_STATE_OPVP_TF_TOWER_NUM_01, WORLD_STATE_OPVP_TF_TOWER_NUM_02, WORLD_STATE_OPVP_TF_TOWER_NUM_03, WORLD_STATE_OPVP_TF_TOWER_NUM_04, WORLD_STATE_OPVP_TF_TOWER_NUM_05, WORLD_STATE_OPVP_TF_TOWER_NUM_06, WORLD_STATE_OPVP_TF_TOWER_NUM_07, WORLD_STATE_OPVP_TF_TOWER_NUM_08, WORLD_STATE_OPVP_TF_TOWER_NUM_09, WORLD_STATE_OPVP_TF_TOWER_NUM_10, WORLD_STATE_OPVP_TF_TOWER_NUM_11, WORLD_STATE_OPVP_TF_TOWER_NUM_12, WORLD_STATE_OPVP_TF_TOWER_NUM_13, WORLD_STATE_OPVP_TF_TOWER_NUM_14, WORLD_STATE_OPVP_TF_TOWER_NUM_15, WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_ALLIANCE, WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_HORDE, WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_NEUTRAL, WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_HOURS, WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_MINUTES_FIRST_DIGIT, WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_MINUTES_SECOND_DIGIT, WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_A, WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_H, WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_DISPLAY, WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_N, WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_POS, WORLD_STATE_OPVP_TF_UI_TOWERS_CONTROLLED_DISPLAY, WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_NOT_READY, WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_READY, WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_A, WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_H, WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_N, WORLD_STATE_OPVP_ZM_MAP_HORDE_FLAG_NOT_READY, WORLD_STATE_OPVP_ZM_MAP_HORDE_FLAG_READY, WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_A, WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_H, WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_N, WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_A, WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_H, WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_N, WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_A, WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_H, WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_N, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_DISPLAY_E, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_DISPLAY_W, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_N_E, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_N_W, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_POS_E, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_POS_W, WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_A, WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_H, WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_N, WORLD_STATE_OPVP_ZM_UNK, WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_MATERIAL, WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TOGGLE, WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TWILIGHT, WORLD_STATE_SCOURGE_INVASION_AZSHARA, WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, WORLD_STATE_SCOURGE_INVASION_TANARIS, WORLD_STATE_SCOURGE_INVASION_WINTERSPRING, WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER, WORLD_STATE_ULDUAR_ALGALON_TIMER_ENABLED, WORLD_STATE_VIOLET_HOLD_PRISON_STATE, WORLD_STATE_VIOLET_HOLD_SHOW, WORLD_STATE_VIOLET_HOLD_WAVE_COUNT, WorldPackets::WorldState::InitWorldStates::Worldstates, WorldPackets::WorldState::InitWorldStates::Write(), and WorldPackets::WorldState::InitWorldStates::ZoneID.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), and UpdateZone().

◆ SendInstanceResetWarning()

void Player::SendInstanceResetWarning ( uint32  mapid,
Difficulty  difficulty,
uint32  time,
bool  onEnterMap 
)
11685{
11686 // pussywizard:
11687 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(GetGUID(), mapid, difficulty);
11688 if (bind && bind->extended)
11689 {
11690 if (!onEnterMap) // extended id player shouldn't be warned about lock expiration
11691 return;
11692 time += (bind->save->GetExtendedResetTime() - bind->save->GetResetTime()); // add lockout period to the time left
11693 }
11694
11695 // type of warning, based on the time remaining until reset
11696 uint32 type;
11697 if (time > 3600)
11698 type = RAID_INSTANCE_WELCOME;
11699 else if (time > 900)
11701 else if (time > 300)
11703 else
11705
11706 WorldPacket data(SMSG_RAID_INSTANCE_MESSAGE, 4 + 4 + 4 + 4);
11707 data << uint32(type);
11708 data << uint32(mapid);
11709 data << uint32(difficulty); // difficulty
11710 data << uint32(time);
11711 if (type == RAID_INSTANCE_WELCOME)
11712 {
11713 data << uint8(bind && bind->perm); // is locked
11714 data << uint8(bind && bind->extended); // is extended, ignored if prev field is 0
11715 }
11716 GetSession()->SendPacket(&data);
11717}
@ RAID_INSTANCE_WARNING_MIN
Definition: Player.h:810
@ RAID_INSTANCE_WARNING_MIN_SOON
Definition: Player.h:811
@ RAID_INSTANCE_WARNING_HOURS
Definition: Player.h:809
@ RAID_INSTANCE_WELCOME
Definition: Player.h:812
@ SMSG_RAID_INSTANCE_MESSAGE
Definition: Opcodes.h:792
Definition: InstanceSaveMgr.h:39
InstanceSave * save
Definition: InstanceSaveMgr.h:40
bool extended
Definition: InstanceSaveMgr.h:42
bool perm
Definition: InstanceSaveMgr.h:41
time_t GetExtendedResetTime() const
Definition: InstanceSaveMgr.h:76
time_t GetResetTime() const
Definition: InstanceSaveMgr.h:75

References InstancePlayerBind::extended, InstanceSave::GetExtendedResetTime(), Object::GetGUID(), InstanceSave::GetResetTime(), GetSession(), InstancePlayerBind::perm, RAID_INSTANCE_WARNING_HOURS, RAID_INSTANCE_WARNING_MIN, RAID_INSTANCE_WARNING_MIN_SOON, RAID_INSTANCE_WELCOME, InstancePlayerBind::save, WorldSession::SendPacket(), sInstanceSaveMgr, and SMSG_RAID_INSTANCE_MESSAGE.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendItemDurations()

void Player::SendItemDurations ( )
4743{
4744 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
4745 {
4746 (*itr)->SendTimeUpdate(this);
4747 }
4748}

References m_itemDuration.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendItemRetrievalMail() [1/2]

void Player::SendItemRetrievalMail ( std::vector< std::pair< uint32, uint32 > >  mailItems)
445{
446 if (mailItems.empty())
447 {
448 // Skip send if empty items
449 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Attempt to send almost with items without items. Player {}", GetGUID().ToString());
450 return;
451 }
452
453 using SendMailTempateVector = std::vector<std::pair<uint32, uint32>>;
454
455 std::vector<SendMailTempateVector> allItems;
456
457 auto AddMailItem = [&allItems](uint32 itemEntry, uint32 itemCount)
458 {
459 SendMailTempateVector toSendItems;
460
461 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemEntry);
462 if (!itemTemplate)
463 {
464 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Item id {} is invalid", itemEntry);
465 return;
466 }
467
468 if (itemCount < 1 || (itemTemplate->MaxCount > 0 && itemCount > static_cast<uint32>(itemTemplate->MaxCount)))
469 {
470 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Incorrect item count ({}) for item id {}", itemEntry, itemCount);
471 return;
472 }
473
474 while (itemCount > itemTemplate->GetMaxStackSize())
475 {
476 if (toSendItems.size() <= MAX_MAIL_ITEMS)
477 {
478 toSendItems.emplace_back(itemEntry, itemTemplate->GetMaxStackSize());
479 itemCount -= itemTemplate->GetMaxStackSize();
480 }
481 else
482 {
483 allItems.emplace_back(toSendItems);
484 toSendItems.clear();
485 }
486 }
487
488 toSendItems.emplace_back(itemEntry, itemCount);
489 allItems.emplace_back(toSendItems);
490 };
491
492 for (auto& [itemEntry, itemCount] : mailItems)
493 {
494 AddMailItem(itemEntry, itemCount);
495 }
496
497 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
498
499 for (auto const& items : allItems)
500 {
501 MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);
502 MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed.
503
504 for (auto const& [itemEntry, itemCount] : items)
505 {
506 if (Item* mailItem = Item::CreateItem(itemEntry, itemCount))
507 {
508 mailItem->SaveToDB(trans);
509 draft.AddItem(mailItem);
510 }
511 }
512
513 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
514 }
515
516 CharacterDatabase.CommitTransaction(trans);
517}

References MailDraft::AddItem(), CharacterDatabase, Item::CreateItem(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), LOG_ERROR, MAIL_CREATURE, MAX_MAIL_ITEMS, ItemTemplate::MaxCount, MailDraft::SendMailTo(), sObjectMgr, and Position::ToString().

◆ SendItemRetrievalMail() [2/2]

void Player::SendItemRetrievalMail ( uint32  itemEntry,
uint32  count 
)

◆ SendLearnPacket()

void Player::SendLearnPacket ( uint32  spellId,
bool  learn 
)
3040{
3041 if (learn)
3042 {
3044 data << uint32(spellId);
3045 data << uint16(0);
3046 GetSession()->SendPacket(&data);
3047 }
3048 else
3049 {
3051 data << uint32(spellId);
3052 GetSession()->SendPacket(&data);
3053 }
3054}
@ SMSG_REMOVED_SPELL
Definition: Opcodes.h:545
@ SMSG_LEARNED_SPELL
Definition: Opcodes.h:329

References GetSession(), WorldSession::SendPacket(), SMSG_LEARNED_SPELL, and SMSG_REMOVED_SPELL.

Referenced by _addSpell(), ActivateSpec(), addTalent(), Spell::EffectApplyGlyph(), WorldSession::HandleRemoveGlyph(), learnSpell(), LearnTalent(), removeSpell(), and resetTalents().

◆ SendLogXPGain()

void Player::SendLogXPGain ( uint32  GivenXP,
Unit victim,
uint32  BonusXP,
bool  recruitAFriend = false,
float  group_rate = 1.0f 
)
2361{
2362 WorldPacket data(SMSG_LOG_XPGAIN, 22); // guess size?
2363 data << (victim ? victim->GetGUID() : ObjectGuid::Empty); // guid
2364 data << uint32(GivenXP + BonusXP); // given experience
2365 data << uint8(victim ? 0 : 1); // 00-kill_xp type, 01-non_kill_xp type
2366
2367 if (victim)
2368 {
2369 data << uint32(GivenXP); // experience without bonus
2370
2371 // should use group_rate here but can't figure out how
2372 data << float(1); // 1 - none 0 - 100% group bonus output
2373 }
2374
2375 data << uint8(recruitAFriend ? 1 : 0); // does the GivenXP include a RaF bonus?
2376 GetSession()->SendPacket(&data);
2377}
@ SMSG_LOG_XPGAIN
Definition: Opcodes.h:494

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), WorldSession::SendPacket(), and SMSG_LOG_XPGAIN.

Referenced by GiveXP().

◆ SendLoot()

void Player::SendLoot ( ObjectGuid  guid,
LootType  loot_type 
)
7774{
7775 if (ObjectGuid lguid = GetLootGUID())
7776 m_session->DoLootRelease(lguid);
7777
7778 Loot* loot = 0;
7779 PermissionTypes permission = ALL_PERMISSION;
7780
7781 LOG_DEBUG("loot", "Player::SendLoot");
7782
7783 // remove FD and invisibility at all loots
7784 constexpr std::array<AuraType, 2> toRemove = {SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_FEIGN_DEATH};
7785 for (auto const& aura : toRemove)
7786 {
7787 RemoveAurasByType(aura);
7788 }
7789 // remove stealth only if looting a corpse
7790 if (loot_type == LOOT_CORPSE && !guid.IsItem())
7791 {
7793 }
7794
7795 if (guid.IsGameObject())
7796 {
7797 LOG_DEBUG("loot", "guid.IsGameObject");
7798 GameObject* go = GetMap()->GetGameObject(guid);
7799
7800 // not check distance for GO in case owned GO (fishing bobber case, for example)
7801 // And permit out of range GO with no owner in case fishing hole
7802 if (!go || (loot_type != LOOT_FISHINGHOLE && ((loot_type != LOOT_FISHING && loot_type != LOOT_FISHING_JUNK) || go->GetOwnerGUID() != GetGUID()) && !go->IsWithinDistInMap(this)) || (loot_type == LOOT_CORPSE && go->GetRespawnTime() && go->isSpawnedByDefault()))
7803 {
7805 SendLootRelease(guid);
7806 return;
7807 }
7808
7809 loot = &go->loot;
7810
7811 // Xinef: loot was generated and respawntime has passed since then, allow to recreate loot
7812 // Xinef: to avoid bugs, this rule covers spawned gameobjects only
7813 if (go->isSpawnedByDefault() && go->getLootState() == GO_ACTIVATED && !go->loot.isLooted() && go->GetLootGenerationTime() + go->GetRespawnDelay() < GameTime::GetGameTime().count())
7815
7816 if (go->getLootState() == GO_READY)
7817 {
7818 uint32 lootid = go->GetGOInfo()->GetLootId();
7819
7820 //TODO: fix this big hack
7822 if (Battleground* bg = GetBattleground())
7823 if (bg->GetBgTypeID(true) == BATTLEGROUND_AV)
7824 if (!bg->ToBattlegroundAV()->PlayerCanDoMineQuest(go->GetEntry(), GetTeamId()))
7825 {
7827 SendLootRelease(guid);
7828 return;
7829 }
7830
7831 if (lootid)
7832 {
7833 loot->clear();
7834
7835 Group* group = GetGroup();
7836 bool groupRules = (group && go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.groupLootRules);
7837
7838 // check current RR player and get next if necessary
7839 if (groupRules)
7840 group->UpdateLooterGuid(go, true);
7841
7842 loot->FillLoot(lootid, LootTemplates_Gameobject, this, !groupRules, false, go->GetLootMode(), go);
7844
7845 // get next RR player (for next loot)
7846 if (groupRules && !go->loot.empty())
7847 group->UpdateLooterGuid(go);
7848 }
7849 if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
7850 loot->generateMoneyLoot(addon->mingold, addon->maxgold);
7851
7852 if (loot_type == LOOT_FISHING)
7853 go->GetFishLoot(loot, this);
7854 else if (loot_type == LOOT_FISHING_JUNK)
7855 go->GetFishLoot(loot, this, true);
7856
7858 {
7859 if (Group* group = GetGroup())
7860 {
7861 switch (group->GetLootMethod())
7862 {
7863 case GROUP_LOOT:
7864 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
7865 group->GroupLoot(loot, go);
7866 break;
7867 case NEED_BEFORE_GREED:
7868 group->NeedBeforeGreed(loot, go);
7869 break;
7870 case MASTER_LOOT:
7871 group->MasterLoot(loot, go);
7872 break;
7873 default:
7874 break;
7875 }
7876 }
7877 }
7878
7879 go->SetLootState(GO_ACTIVATED, this);
7880 }
7881
7882 if (go->getLootState() == GO_ACTIVATED)
7883 {
7884 if (Group* group = GetGroup())
7885 {
7886 switch (group->GetLootMethod())
7887 {
7888 case MASTER_LOOT:
7890 break;
7891 case FREE_FOR_ALL:
7892 permission = ALL_PERMISSION;
7893 break;
7894 case ROUND_ROBIN:
7895 permission = ROUND_ROBIN_PERMISSION;
7896 break;
7897 default:
7898 permission = GROUP_PERMISSION;
7899 break;
7900 }
7901 }
7902 else
7903 permission = ALL_PERMISSION;
7904 }
7905 }
7906 else if (guid.IsItem())
7907 {
7908 Item* item = GetItemByGuid(guid);
7909
7910 if (!item)
7911 {
7912 SendLootRelease(guid);
7913 return;
7914 }
7915
7916 permission = OWNER_PERMISSION;
7917
7918 loot = &item->loot;
7919
7920 // Xinef: Store container id
7921 loot->containerGUID = item->GetGUID();
7922
7923 if (!item->m_lootGenerated && !sLootItemStorage->LoadStoredLoot(item, this))
7924 {
7925 item->m_lootGenerated = true;
7926 loot->clear();
7927
7928 switch (loot_type)
7929 {
7930 case LOOT_DISENCHANTING:
7931 loot->FillLoot(item->GetTemplate()->DisenchantID, LootTemplates_Disenchant, this, true);
7932 break;
7933 case LOOT_PROSPECTING:
7934 loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this, true);
7935 break;
7936 case LOOT_MILLING:
7937 loot->FillLoot(item->GetEntry(), LootTemplates_Milling, this, true);
7938 break;
7939 default:
7941 loot->FillLoot(item->GetEntry(), LootTemplates_Item, this, true, loot->gold != 0);
7942
7943 // Xinef: Add to storage
7944 if (loot->gold > 0 || loot->unlootedCount > 0)
7945 sLootItemStorage->AddNewStoredLoot(loot, this);
7946
7947 break;
7948 }
7949 }
7950 }
7951 else if (guid.IsCorpse()) // remove insignia
7952 {
7953 Corpse* bones = ObjectAccessor::GetCorpse(*this, guid);
7954
7955 if (!bones || !(loot_type == LOOT_CORPSE || loot_type == LOOT_INSIGNIA) || bones->GetType() != CORPSE_BONES || !bones->HasFlag(CORPSE_FIELD_DYNAMIC_FLAGS, CORPSE_DYNFLAG_LOOTABLE))
7956 {
7957 SendLootRelease(guid);
7958 return;
7959 }
7960
7961 loot = &bones->loot;
7962
7963 if (loot->loot_type == LOOT_NONE)
7964 {
7965 uint32 pLevel = bones->loot.gold;
7966 bones->loot.clear();
7967
7968 loot->FillLoot(GetTeamId(), LootTemplates_Player, this, true);
7969
7970 // It may need a better formula
7971 // Now it works like this: lvl10: ~6copper, lvl70: ~9silver
7972 bones->loot.gold = uint32(urand(50, 150) * 0.016f * pow(float(pLevel) / 5.76f, 2.5f) * sWorld->getRate(RATE_DROP_MONEY));
7973 }
7974
7975 if (bones->lootRecipient != this)
7976 permission = NONE_PERMISSION;
7977 else
7978 permission = OWNER_PERMISSION;
7979 }
7980 else
7981 {
7982 Creature* creature = GetMap()->GetCreature(guid);
7983
7984 // must be in range and creature must be alive for pickpocket and must be dead for another loot
7985 if (!creature || creature->IsAlive() != (loot_type == LOOT_PICKPOCKETING) || !creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
7986 {
7987 SendLootRelease(guid);
7988 return;
7989 }
7990
7991 if (loot_type == LOOT_PICKPOCKETING && IsFriendlyTo(creature))
7992 {
7993 SendLootRelease(guid);
7994 return;
7995 }
7996
7997 loot = &creature->loot;
7998
7999 if (loot_type == LOOT_PICKPOCKETING)
8000 {
8001 if (!loot || loot->loot_type != LOOT_PICKPOCKETING)
8002 {
8003 if (creature->CanGeneratePickPocketLoot())
8004 {
8005 creature->SetPickPocketLootTime();
8006 loot->clear();
8007
8008 if (uint32 lootid = creature->GetCreatureTemplate()->pickpocketLootId)
8009 loot->FillLoot(lootid, LootTemplates_Pickpocketing, this, true);
8010
8011 // Generate extra money for pick pocket loot
8012 const uint32 a = urand(0, creature->GetLevel() / 2);
8013 const uint32 b = urand(0, GetLevel() / 2);
8014 loot->gold = uint32(10 * (a + b) * sWorld->getRate(RATE_DROP_MONEY));
8015 permission = OWNER_PERMISSION;
8016 }
8017 else
8018 {
8019 permission = NONE_PERMISSION;
8021 return;
8022 }
8023 }
8024 }
8025 else
8026 {
8027 // Xinef: Exploit fix
8028 if (!creature->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE))
8029 {
8031 return;
8032 }
8033
8034 // the player whose group may loot the corpse
8035 Player* recipient = creature->GetLootRecipient();
8036 Group* recipientGroup = creature->GetLootRecipientGroup();
8037 if (!recipient && !recipientGroup)
8038 return;
8039
8040 if (loot->loot_type == LOOT_NONE)
8041 {
8042 // for creature, loot is filled when creature is killed.
8043 if (recipientGroup)
8044 {
8045 switch (recipientGroup->GetLootMethod())
8046 {
8047 case GROUP_LOOT:
8048 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
8049 recipientGroup->GroupLoot(loot, creature);
8050 break;
8051 case NEED_BEFORE_GREED:
8052 recipientGroup->NeedBeforeGreed(loot, creature);
8053 break;
8054 case MASTER_LOOT:
8055 recipientGroup->MasterLoot(loot, creature);
8056 break;
8057 default:
8058 break;
8059 }
8060 }
8061 }
8062
8063 // if loot is already skinning loot then don't do anything else
8064 if (loot->loot_type == LOOT_SKINNING)
8065 {
8066 loot_type = LOOT_SKINNING;
8067 permission = creature->GetLootRecipientGUID() == GetGUID() ? OWNER_PERMISSION : NONE_PERMISSION;
8068 }
8069 else if (loot_type == LOOT_SKINNING)
8070 {
8071 loot->clear();
8072 loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, this, true);
8073 permission = OWNER_PERMISSION;
8074
8075 //Inform instance if creature is skinned.
8076 if (InstanceScript* mapInstance = creature->GetInstanceScript())
8077 {
8078 mapInstance->CreatureLooted(creature, LOOT_SKINNING);
8079 }
8080
8081 // Xinef: Set new loot recipient
8082 creature->SetLootRecipient(this, false);
8083 }
8084 // set group rights only for loot_type != LOOT_SKINNING
8085 else
8086 {
8087 if (recipientGroup)
8088 {
8089 if (GetGroup() == recipientGroup)
8090 {
8091 switch (recipientGroup->GetLootMethod())
8092 {
8093 case MASTER_LOOT:
8094 permission = recipientGroup->GetMasterLooterGuid() == GetGUID() ? MASTER_PERMISSION : RESTRICTED_PERMISSION;
8095 break;
8096 case FREE_FOR_ALL:
8097 permission = ALL_PERMISSION;
8098 break;
8099 case ROUND_ROBIN:
8100 permission = ROUND_ROBIN_PERMISSION;
8101 break;
8102 default:
8103 permission = GROUP_PERMISSION;
8104 break;
8105 }
8106 }
8107 else
8108 permission = NONE_PERMISSION;
8109 }
8110 else if (recipient == this)
8111 permission = OWNER_PERMISSION;
8112 else
8113 permission = NONE_PERMISSION;
8114 }
8115 }
8116 }
8117
8118 // LOOT_INSIGNIA and LOOT_FISHINGHOLE unsupported by client
8119 switch (loot_type)
8120 {
8121 case LOOT_INSIGNIA:
8122 loot_type = LOOT_SKINNING;
8123 break;
8124 case LOOT_FISHINGHOLE:
8125 loot_type = LOOT_FISHING;
8126 break;
8127 case LOOT_FISHING_JUNK:
8128 loot_type = LOOT_FISHING;
8129 break;
8130 default:
8131 break;
8132 }
8133
8134 // need know merged fishing/corpse loot type for achievements
8135 loot->loot_type = loot_type;
8136
8137 if (!sScriptMgr->OnAllowedToLootContainerCheck(this, guid))
8138 {
8140 return;
8141 }
8142
8143 if (permission != NONE_PERMISSION)
8144 {
8145 SetLootGUID(guid);
8146
8147 WorldPacket data(SMSG_LOOT_RESPONSE, (9 + 50)); // we guess size
8148 data << guid;
8149 data << uint8(loot_type);
8150 data << LootView(*loot, this, permission);
8151
8152 SendDirectMessage(&data);
8153
8154 // add 'this' player as one of the players that are looting 'loot'
8155 loot->AddLooter(GetGUID());
8156
8157 if (loot_type == LOOT_CORPSE && !guid.IsItem())
8159 }
8160 else
8162}
@ GAMEOBJECT_BYTES_1
Definition: UpdateFields.h:404
@ CORPSE_BONES
Definition: Corpse.h:28
@ GO_ACTIVATED
Definition: GameObject.h:112
@ GO_READY
Definition: GameObject.h:111
@ SPELL_AURA_MOD_INVISIBILITY
Definition: SpellAuraDefines.h:81
@ SPELL_AURA_FEIGN_DEATH
Definition: SpellAuraDefines.h:129
@ SPELL_AURA_MOD_STEALTH
Definition: SpellAuraDefines.h:79
@ RATE_DROP_MONEY
Definition: IWorld.h:471
@ BG_AV_OBJECTID_MINE_N
Definition: BattlegroundAV.h:161
@ BG_AV_OBJECTID_MINE_S
Definition: BattlegroundAV.h:162
PermissionTypes
Definition: LootMgr.h:66
@ OWNER_PERMISSION
Definition: LootMgr.h:72
@ ALL_PERMISSION
Definition: LootMgr.h:67
@ RESTRICTED_PERMISSION
Definition: LootMgr.h:70
@ NONE_PERMISSION
Definition: LootMgr.h:73
@ ROUND_ROBIN_PERMISSION
Definition: LootMgr.h:71
@ MASTER_PERMISSION
Definition: LootMgr.h:69
@ GROUP_PERMISSION
Definition: LootMgr.h:68
@ LOOT_ERROR_DIDNT_KILL
Definition: LootMgr.h:96
@ LOOT_ERROR_ALREADY_PICKPOCKETED
Definition: LootMgr.h:107
@ LOOT_PICKPOCKETING
Definition: LootMgr.h:81
@ LOOT_MILLING
Definition: LootMgr.h:87
@ LOOT_FISHING_JUNK
Definition: LootMgr.h:91
@ LOOT_CORPSE
Definition: LootMgr.h:80
@ LOOT_FISHING
Definition: LootMgr.h:82
@ LOOT_DISENCHANTING
Definition: LootMgr.h:83
@ LOOT_FISHINGHOLE
Definition: LootMgr.h:89
@ LOOT_NONE
Definition: LootMgr.h:78
@ LOOT_PROSPECTING
Definition: LootMgr.h:86
LootStore LootTemplates_Skinning("skinning_loot_template", "creature skinning id", true)
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
LootStore LootTemplates_Item("item_loot_template", "item entry", true)
LootStore LootTemplates_Milling("milling_loot_template", "item entry (herb)", true)
LootStore LootTemplates_Disenchant("disenchant_loot_template", "item disenchant id", true)
LootStore LootTemplates_Prospecting("prospecting_loot_template", "item entry (ore)", true)
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template", "creature pickpocket lootid", true)
LootStore LootTemplates_Player("player_loot_template", "team id", true)
@ GAMEOBJECT_TYPE_CHEST
Definition: SharedDefines.h:1563
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3121
@ SMSG_LOOT_RESPONSE
Definition: Opcodes.h:382
Corpse * GetCorpse(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:179
Loot loot
Definition: Creature.h:230
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1326
ObjectGuid GetLootRecipientGUID() const
Definition: Creature.h:231
void SetPickPocketLootTime()
Definition: Creature.cpp:3790
Player * GetLootRecipient() const
Definition: Creature.cpp:1312
bool CanGeneratePickPocketLoot() const
Definition: Creature.cpp:3795
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1319
uint32 SkinLootId
Definition: CreatureData.h:226
uint32 pickpocketLootId
Definition: CreatureData.h:225
uint32 GetRespawnDelay() const
Definition: GameObject.h:197
bool IsWithinDistInMap(Player const *player) const
Definition: GameObject.cpp:2988
Loot loot
Definition: GameObject.h:246
LootState getLootState() const
Definition: GameObject.h:223
bool isSpawnedByDefault() const
Definition: GameObject.h:195
void GetFishLoot(Loot *fishLoot, Player *lootOwner, bool junk=false)
Definition: GameObject.cpp:1005
time_t GetRespawnTime() const
Definition: GameObject.h:183
uint32 GetLootGenerationTime() const
Definition: GameObject.h:257
void SetLootState(LootState s, Unit *unit=nullptr)
Definition: GameObject.cpp:2427
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:173
GameObjectTemplateAddon const * GetTemplateAddon() const
Definition: GameObject.cpp:915
void SetLootGenerationTime()
Definition: GameObject.cpp:2917
uint16 GetLootMode() const
Definition: GameObject.h:227
uint32 type
Definition: GameObjectData.h:33
uint32 groupLootRules
Definition: GameObjectData.h:98
struct GameObjectTemplate::@231::@236 chest
uint32 GetLootId() const
Definition: GameObjectData.h:539
Definition: GameObjectData.h:664
Loot loot
Definition: Item.h:320
uint32 DisenchantID
Definition: ItemTemplate.h:690
uint32 MinMoneyLoot
Definition: ItemTemplate.h:692
uint32 MaxMoneyLoot
Definition: ItemTemplate.h:693
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:123
void ForceValuesUpdateAtIndex(uint32)
Definition: Object.cpp:2078
bool IsCorpse() const
Definition: ObjectGuid.h:173
bool IsItem() const
Definition: ObjectGuid.h:170
bool IsGameObject() const
Definition: ObjectGuid.h:171
void SendLootRelease(ObjectGuid guid)
Definition: Player.cpp:7766
void SetLootGUID(ObjectGuid guid)
Definition: Player.h:2003
void SendLootError(ObjectGuid guid, LootError error)
Definition: Player.cpp:8164
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10281
void NeedBeforeGreed(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1159
ObjectGuid GetMasterLooterGuid() const
Definition: Group.cpp:2325
void GroupLoot(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1003
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1867
void MasterLoot(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1310
void AddLooter(ObjectGuid GUID)
Definition: LootMgr.h:373
ObjectGuid containerGUID
Definition: LootMgr.h:329
bool empty() const
Definition: LootMgr.h:367
void clear()
Definition: LootMgr.h:343
uint8 unlootedCount
Definition: LootMgr.h:323
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition: LootMgr.cpp:837
Definition: LootMgr.h:405

References Loot::AddLooter(), ALL_PERMISSION, BATTLEGROUND_AV, BG_AV_OBJECTID_MINE_N, BG_AV_OBJECTID_MINE_S, Creature::CanGeneratePickPocketLoot(), GameObjectTemplate::chest, Loot::clear(), Loot::containerGUID, CORPSE_BONES, CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, ItemTemplate::DisenchantID, WorldSession::DoLootRelease(), Loot::empty(), Loot::FillLoot(), Object::ForceValuesUpdateAtIndex(), FREE_FOR_ALL, GAMEOBJECT_BYTES_1, GAMEOBJECT_TYPE_CHEST, Loot::generateMoneyLoot(), GetBattleground(), ObjectAccessor::GetCorpse(), Map::GetCreature(), Creature::GetCreatureTemplate(), Object::GetEntry(), GameObject::GetFishLoot(), Map::GetGameObject(), GameTime::GetGameTime(), GameObject::GetGOInfo(), GetGroup(), Object::GetGUID(), WorldObject::GetInstanceScript(), GetItemByGuid(), Unit::GetLevel(), GameObject::GetLootGenerationTime(), GetLootGUID(), GameObjectTemplate::GetLootId(), Group::GetLootMethod(), GameObject::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GameObject::getLootState(), WorldObject::GetMap(), Group::GetMasterLooterGuid(), GameObject::GetOwnerGUID(), GameObject::GetRespawnDelay(), GameObject::GetRespawnTime(), GetTeamId(), Item::GetTemplate(), GameObject::GetTemplateAddon(), Corpse::GetType(), GO_ACTIVATED, GO_READY, Loot::gold, GROUP_LOOT, GROUP_PERMISSION, Group::GroupLoot(), GameObjectTemplate::groupLootRules, Object::HasDynamicFlag(), Object::HasFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), ObjectGuid::IsCorpse(), Unit::IsFriendlyTo(), ObjectGuid::IsGameObject(), ObjectGuid::IsItem(), Loot::isLooted(), GameObject::isSpawnedByDefault(), GameObject::IsWithinDistInMap(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Corpse::loot, Creature::loot, GameObject::loot, Item::loot, LOOT_CORPSE, LOOT_DISENCHANTING, LOOT_ERROR_ALREADY_PICKPOCKETED, LOOT_ERROR_DIDNT_KILL, LOOT_FISHING, LOOT_FISHING_JUNK, LOOT_FISHINGHOLE, LOOT_INSIGNIA, LOOT_MILLING, LOOT_NONE, LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_SKINNING, Loot::loot_type, Corpse::lootRecipient, LootTemplates_Disenchant, LootTemplates_Gameobject, LootTemplates_Item, LootTemplates_Milling, LootTemplates_Pickpocketing, LootTemplates_Player, LootTemplates_Prospecting, LootTemplates_Skinning, Item::m_lootGenerated, m_session, MASTER_LOOT, MASTER_PERMISSION, Group::MasterLoot(), ItemTemplate::MaxMoneyLoot, ItemTemplate::MinMoneyLoot, NEED_BEFORE_GREED, Group::NeedBeforeGreed(), NONE_PERMISSION, OWNER_PERMISSION, CreatureTemplate::pickpocketLootId, RATE_DROP_MONEY, Unit::RemoveAurasByType(), RESTRICTED_PERMISSION, ROUND_ROBIN, ROUND_ROBIN_PERMISSION, SendDirectMessage(), SendLootError(), SendLootRelease(), GameObject::SetLootGenerationTime(), SetLootGUID(), Creature::SetLootRecipient(), GameObject::SetLootState(), Creature::SetPickPocketLootTime(), Unit::SetUnitFlag(), CreatureTemplate::SkinLootId, sLootItemStorage, SMSG_LOOT_RESPONSE, SPELL_AURA_FEIGN_DEATH, SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_MOD_STEALTH, sScriptMgr, sWorld, GameObjectTemplate::type, UNIT_DYNFLAG_LOOTABLE, UNIT_FLAG_LOOTING, Loot::unlootedCount, Group::UpdateLooterGuid(), and urand().

Referenced by Spell::EffectMilling(), Spell::EffectPickPocket(), Spell::EffectProspecting(), Spell::EffectSkinning(), WorldSession::HandleLootOpcode(), WorldSession::HandleOpenItemOpcode(), go_hive_pod::OnGossipHello(), RemovedInsignia(), Spell::SendLoot(), and GameObject::Use().

◆ SendLootError()

void Player::SendLootError ( ObjectGuid  guid,
LootError  error 
)

◆ SendLootRelease()

void Player::SendLootRelease ( ObjectGuid  guid)
7767{
7769 data << guid << uint8(1);
7770 SendDirectMessage(&data);
7771}
@ SMSG_LOOT_RELEASE_RESPONSE
Definition: Opcodes.h:383

References SendDirectMessage(), and SMSG_LOOT_RELEASE_RESPONSE.

Referenced by WorldSession::DoLootRelease(), WorldSession::HandleAutostoreLootItemOpcode(), SendLoot(), and StoreLootItem().

◆ SendMailResult()

void Player::SendMailResult ( uint32  mailId,
MailResponseType  mailAction,
MailResponseResult  mailError,
uint32  equipError = 0,
ObjectGuid::LowType  item_guid = 0,
uint32  item_count = 0 
)
2868{
2869 WorldPacket data(SMSG_SEND_MAIL_RESULT, (4 + 4 + 4 + (mailError == MAIL_ERR_EQUIP_ERROR ? 4 : (mailAction == MAIL_ITEM_TAKEN ? 4 + 4 : 0))));
2870 data << (uint32) mailId;
2871 data << (uint32) mailAction;
2872 data << (uint32) mailError;
2873 if (mailError == MAIL_ERR_EQUIP_ERROR)
2874 data << (uint32) equipError;
2875 else if (mailAction == MAIL_ITEM_TAKEN)
2876 {
2877 data << (uint32) item_guid; // item guid low?
2878 data << (uint32) item_count; // item count?
2879 }
2880 GetSession()->SendPacket(&data);
2881}
@ MAIL_ITEM_TAKEN
Definition: SharedDefines.h:3518
@ MAIL_ERR_EQUIP_ERROR
Definition: SharedDefines.h:3527
@ SMSG_SEND_MAIL_RESULT
Definition: Opcodes.h:599

References GetSession(), MAIL_ERR_EQUIP_ERROR, MAIL_ITEM_TAKEN, WorldSession::SendPacket(), and SMSG_SEND_MAIL_RESULT.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and WorldSession::HandleSendMail().

◆ SendMessageToSet() [1/2]

◆ SendMessageToSet() [2/2]

void Player::SendMessageToSet ( WorldPacket const *  data,
Player const *  skipped_rcvr 
) const
overridevirtual

Reimplemented from WorldObject.

5705{
5706 if (skipped_rcvr != this)
5707 SendDirectMessage(data);
5708
5709 Acore::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr);
5711}
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius)
Definition: CellImpl.h:175
Definition: GridNotifiers.h:100

References WorldObject::GetVisibilityRange(), SendDirectMessage(), and Cell::VisitWorldObjects().

◆ SendMessageToSetInRange() [1/2]

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self 
) const
overridevirtual

Reimplemented from WorldObject.

5683{
5684 if (self)
5685 SendDirectMessage(data);
5686
5687 Acore::MessageDistDeliverer notifier(this, data, dist);
5688 Cell::VisitWorldObjects(this, notifier, dist);
5689}

References SendDirectMessage(), and Cell::VisitWorldObjects().

Referenced by Say(), AchievementMgr::SendAchievementEarned(), SendMessageToSet(), TextEmote(), and Yell().

◆ SendMessageToSetInRange() [2/2]

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self,
bool  includeMargin,
bool  ownTeamOnly,
bool  required3dDist = false 
) const
5692{
5693 if (self)
5694 SendDirectMessage(data);
5695
5696 dist += GetObjectSize();
5697 if (includeMargin)
5698 dist += VISIBILITY_COMPENSATION; // pussywizard: to ensure everyone receives all important packets
5699
5700 Acore::MessageDistDeliverer notifier(this, data, dist, ownTeamOnly, nullptr, required3dDist);
5701 Cell::VisitWorldObjects(this, notifier, dist);
5702}
#define VISIBILITY_COMPENSATION
Definition: ObjectDefines.h:26
float GetObjectSize() const
Definition: Object.cpp:2784

References WorldObject::GetObjectSize(), SendDirectMessage(), VISIBILITY_COMPENSATION, and Cell::VisitWorldObjects().

◆ SendMirrorTimer()

void Player::SendMirrorTimer ( MirrorTimerType  Type,
uint32  MaxValue,
uint32  CurrentValue,
int32  Regen 
)
protected
738{
739 if (int(MaxValue) == DISABLED_MIRROR_TIMER)
740 {
741 if (int(CurrentValue) != DISABLED_MIRROR_TIMER)
742 StopMirrorTimer(Type);
743 return;
744 }
745 SendDirectMessage(WorldPackets::Misc::StartMirrorTimer(Type, CurrentValue, MaxValue, Regen, 0, 0).Write());
746}
Definition: MiscPackets.h:121

References DISABLED_MIRROR_TIMER, SendDirectMessage(), and StopMirrorTimer().

Referenced by HandleDrowning().

◆ SendMovieStart()

void Player::SendMovieStart ( uint32  MovieId)
5730{
5732 data << uint32(MovieId);
5733 SendDirectMessage(&data);
5734}
@ SMSG_TRIGGER_MOVIE
Definition: Opcodes.h:1154

References SendDirectMessage(), and SMSG_TRIGGER_MOVIE.

Referenced by debug_commandscript::HandleDebugPlayMovieCommand().

◆ SendNewItem()

void Player::SendNewItem ( Item item,
uint32  count,
bool  received,
bool  created,
bool  broadcast = false,
bool  sendChatMessage = true 
)
4751{
4752 if (!item) // prevent crash
4753 return;
4754
4755 // last check 2.0.10
4756 WorldPacket data(SMSG_ITEM_PUSH_RESULT, (8 + 4 + 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4));
4757 data << GetGUID(); // player GUID
4758 data << uint32(received); // 0=looted, 1=from npc
4759 data << uint32(created); // 0=received, 1=created
4760 data << uint32(sendChatMessage); // bool print message to chat
4761 data << uint8(item->GetBagSlot()); // bagslot
4762 // item slot, but when added to stack: 0xFFFFFFFF
4763 data << uint32((item->GetCount() == count) ? item->GetSlot() : -1);
4764 data << uint32(item->GetEntry()); // item id
4765 data << uint32(item->GetItemSuffixFactor()); // SuffixFactor
4766 data << int32(item->GetItemRandomPropertyId()); // random item property id
4767 data << uint32(count); // count of items
4768 data << uint32(GetItemCount(item->GetEntry())); // count of items in inventory
4769
4770 if (broadcast && GetGroup())
4771 GetGroup()->BroadcastPacket(&data, true);
4772 else
4773 GetSession()->SendPacket(&data);
4774}
@ SMSG_ITEM_PUSH_RESULT
Definition: Opcodes.h:388
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition: Group.cpp:1756

References Group::BroadcastPacket(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetItemCount(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), GetSession(), Item::GetSlot(), WorldSession::SendPacket(), and SMSG_ITEM_PUSH_RESULT.

Referenced by _StoreOrEquipNewItem(), AddItem(), AutoStoreLoot(), Spell::DoCreateItem(), GiveQuestSourceItem(), misc_commandscript::HandleAddItemCommand(), misc_commandscript::HandleAddItemSetCommand(), AuraEffect::HandleChannelDeathItem(), OPvPCapturePointNA::HandleCustomSpell(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandlePetitionBuyOpcode(), RefundItem(), RemovePet(), RewardQuest(), npc_oculus_drakegiver::StoreEssence(), and StoreLootItem().

◆ SendNewMail()

void Player::SendNewMail ( )
2884{
2885 // deliver undelivered mail
2887 data << (uint32) 0;
2888 GetSession()->SendPacket(&data);
2889}
@ SMSG_RECEIVED_MAIL
Definition: Opcodes.h:675

References GetSession(), WorldSession::SendPacket(), and SMSG_RECEIVED_MAIL.

Referenced by AddNewMailDeliverTime(), and Update().

◆ SendNotifyLootItemRemoved()

void Player::SendNotifyLootItemRemoved ( uint8  lootSlot)
8180{
8182 data << uint8(lootSlot);
8183 GetSession()->SendPacket(&data);
8184}
@ SMSG_LOOT_REMOVED
Definition: Opcodes.h:384

References GetSession(), WorldSession::SendPacket(), and SMSG_LOOT_REMOVED.

Referenced by Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), and StoreLootItem().

◆ SendNotifyLootMoneyRemoved()

void Player::SendNotifyLootMoneyRemoved ( )
8174{
8176 GetSession()->SendPacket(&data);
8177}
@ SMSG_LOOT_CLEAR_MONEY
Definition: Opcodes.h:387

References GetSession(), WorldSession::SendPacket(), and SMSG_LOOT_CLEAR_MONEY.

Referenced by Loot::NotifyMoneyRemoved().

◆ SendPreparedGossip()

void Player::SendPreparedGossip ( WorldObject source)
210{
211 if (!source)
212 return;
213
214 if (source->IsCreature())
215 {
216 // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag)
218 {
219 SendPreparedQuest(source->GetGUID());
220 return;
221 }
222 }
223 else if (source->IsGameObject())
224 {
225 // probably need to find a better way here
227 {
228 SendPreparedQuest(source->GetGUID());
229 return;
230 }
231 }
232
233 // in case non empty gossip menu (that not included quests list size) show it
234 // (quest entries from quest menu will be included in list)
235
236 uint32 textId = GetGossipTextId(source);
237
239 textId = GetGossipTextId(menuId, source);
240
241 PlayerTalkClass->SendGossipMenu(textId, source->GetGUID());
242}
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:315
bool Empty() const
Definition: GossipDef.h:242
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
Definition: GossipDef.cpp:193

References QuestMenu::Empty(), PlayerMenu::GetGossipMenu(), GetGossipTextId(), Object::GetGUID(), GossipMenu::GetMenuId(), PlayerMenu::GetQuestMenu(), Unit::HasNpcFlag(), Object::IsCreature(), Object::IsGameObject(), PlayerTalkClass, PlayerMenu::SendGossipMenu(), SendPreparedQuest(), Object::ToCreature(), and UNIT_NPC_FLAG_GOSSIP.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ SendPreparedQuest()

void Player::SendPreparedQuest ( ObjectGuid  guid)
Todo:
verify if check for !quest->IsDaily() is really correct (possibly not)
116{
117 QuestMenu& questMenu = PlayerTalkClass->GetQuestMenu();
118 if (questMenu.Empty())
119 return;
120
121 // single element case
122 if (questMenu.GetMenuItemCount() == 1)
123 {
124 QuestMenuItem const& qmi0 = questMenu.GetItem(0);
125 uint32 questId = qmi0.QuestId;
126
127 // Auto open -- maybe also should verify there is no greeting
128 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
129 {
130 if (qmi0.QuestIcon == 4)
131 PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanRewardQuest(quest, false), true);
132 // Send completable on repeatable and autoCompletable quest if player don't have quest
134 else
135 {
137 if (!object || (!object->hasQuest(questId) && !object->hasInvolvedQuest(questId)))
138 {
140 return;
141 }
142
143 if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true))
144 AddQuestAndCheckCompletion(quest, object);
145
146 if (quest->IsAutoComplete() || !quest->GetQuestMethod())
148 else
150 }
151 }
152 }
153 // multiple entries
154 else
155 {
156 QEmote qe;
157 qe._Delay = 0;
158 qe._Emote = 0;
159 std::string title = "";
160
161 // need pet case for some quests
163 if (creature)
164 {
165 uint32 textid = GetGossipTextId(creature);
166 GossipText const* gossiptext = sObjectMgr->GetGossipText(textid);
167 if (!gossiptext)
168 {
169 qe._Delay = 0; //TEXTEMOTE_MESSAGE; //zyg: player emote
170 qe._Emote = 0; //TEXTEMOTE_HELLO; //zyg: NPC emote
171 title = "";
172 }
173 else
174 {
175 qe = gossiptext->Options[0].Emotes[0];
176
177 if (!gossiptext->Options[0].Text_0.empty())
178 {
179 title = gossiptext->Options[0].Text_0;
180
181 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
182 if (loc_idx >= 0)
183 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
184 ObjectMgr::GetLocaleString(npcTextLocale->Text_0[0], loc_idx, title);
185 }
186 else
187 {
188 title = gossiptext->Options[0].Text_1;
189
190 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
191 if (loc_idx >= 0)
192 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
193 ObjectMgr::GetLocaleString(npcTextLocale->Text_1[0], loc_idx, title);
194 }
195 }
196 }
197
199 }
200}
@ TYPEMASK_ITEM
Definition: ObjectGuid.h:47
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:49
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:51
Definition: GossipDef.h:155
uint32 QuestId
Definition: GossipDef.h:156
uint8 QuestIcon
Definition: GossipDef.h:157
QuestMenuItem const & GetItem(uint16 index) const
Definition: GossipDef.h:249
uint8 GetMenuItemCount() const
Definition: GossipDef.h:237
void SendQuestGiverQuestList(QEmote const &eEmote, std::string const &Title, ObjectGuid guid)
Definition: GossipDef.cpp:315
void SendQuestGiverQuestDetails(Quest const *quest, ObjectGuid npcGUID, bool activateAccept) const
Definition: GossipDef.cpp:388
void SendQuestGiverRequestItems(Quest const *quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const
Definition: GossipDef.cpp:752
Definition: Object.h:104
virtual bool hasQuest(uint32) const
Definition: Object.h:190
virtual bool hasInvolvedQuest(uint32) const
Definition: Object.h:191
bool CanAddQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:264
void AddQuestAndCheckCompletion(Quest const *quest, Object *questGiver)
Definition: PlayerQuest.cpp:421
bool CanCompleteRepeatableQuest(Quest const *quest)
Definition: PlayerQuest.cpp:366
Definition: NPCHandler.h:25
uint32 _Emote
Definition: NPCHandler.h:26
uint32 _Delay
Definition: NPCHandler.h:27
std::string Text_0
Definition: NPCHandler.h:34
QEmote Emotes[MAX_GOSSIP_TEXT_EMOTES]
Definition: NPCHandler.h:39
std::string Text_1
Definition: NPCHandler.h:35
Definition: NPCHandler.h:45
GossipTextOption Options[MAX_GOSSIP_TEXT_OPTIONS]
Definition: NPCHandler.h:46
Definition: NPCHandler.h:55

References QEmote::_Delay, QEmote::_Emote, AddQuestAndCheckCompletion(), CanAddQuest(), CanCompleteRepeatableQuest(), CanRewardQuest(), CanTakeQuest(), GossipTextOption::Emotes, QuestMenu::Empty(), ObjectAccessor::GetCreatureOrPetOrVehicle(), GetGossipTextId(), QuestMenu::GetItem(), ObjectMgr::GetLocaleString(), QuestMenu::GetMenuItemCount(), ObjectAccessor::GetObjectByTypeMask(), PlayerMenu::GetQuestMenu(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Object::hasInvolvedQuest(), Object::hasQuest(), GossipText::Options, PlayerTalkClass, QuestMenuItem::QuestIcon, QuestMenuItem::QuestId, PlayerMenu::SendCloseGossip(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestGiverQuestList(), PlayerMenu::SendQuestGiverRequestItems(), sObjectMgr, GossipTextOption::Text_0, GossipTextOption::Text_1, TYPEMASK_GAMEOBJECT, TYPEMASK_ITEM, and TYPEMASK_UNIT.

Referenced by npc_cos_chromie_middle::OnGossipHello(), OnGossipSelect(), SendPreparedGossip(), npc_costumed_orphan_matron::sGossipHello(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ SendProficiency()

void Player::SendProficiency ( ItemClass  itemClass,
uint32  itemSubclassMask 
)
10050{
10051 WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4);
10052 data << uint8(itemClass) << uint32(itemSubclassMask);
10053 GetSession()->SendPacket(&data);
10054}
@ SMSG_SET_PROFICIENCY
Definition: Opcodes.h:325

References GetSession(), WorldSession::SendPacket(), and SMSG_SET_PROFICIENCY.

Referenced by Spell::EffectProficiency().

◆ SendPushToPartyResponse()

void Player::SendPushToPartyResponse ( Player const *  player,
uint8  msg 
) const
2436{
2437 if (player)
2438 {
2439 WorldPacket data(MSG_QUEST_PUSH_RESULT, (8 + 1));
2440 data << player->GetGUID();
2441 data << uint8(msg); // valid values: 0-8
2442 GetSession()->SendPacket(&data);
2443 LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT");
2444 }
2445}
@ MSG_QUEST_PUSH_RESULT
Definition: Opcodes.h:660

References Object::GetGUID(), GetSession(), LOG_DEBUG, MSG_QUEST_PUSH_RESULT, and WorldSession::SendPacket().

Referenced by CanShareQuest(), debug_commandscript::HandleDebugSendQuestPartyMsgCommand(), WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestComplete()

void Player::SendQuestComplete ( uint32  quest_id)
2347{
2348 if (quest_id)
2349 {
2351 data << uint32(quest_id);
2352 GetSession()->SendPacket(&data);
2353 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = {}", quest_id);
2354 }
2355}
@ SMSG_QUESTUPDATE_COMPLETE
Definition: Opcodes.h:438

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_COMPLETE.

Referenced by AreaExploredOrEventHappens().

◆ SendQuestConfirmAccept()

void Player::SendQuestConfirmAccept ( Quest const *  quest,
Player pReceiver 
)
2414{
2415 if (pReceiver)
2416 {
2417 //load locale from db
2418 std::string strTitle = quest->GetTitle();
2419
2420 int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex();
2421 if (loc_idx >= 0)
2422 if (const QuestLocale* pLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
2423 ObjectMgr::GetLocaleString(pLocale->Title, loc_idx, strTitle);
2424
2425 WorldPacket data(SMSG_QUEST_CONFIRM_ACCEPT, (4 + quest->GetTitle().size() + 8));
2426 data << uint32(quest->GetQuestId());
2427 data << quest->GetTitle();
2428 data << GetGUID();
2429 pReceiver->GetSession()->SendPacket(&data);
2430
2431 LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT");
2432 }
2433}
@ SMSG_QUEST_CONFIRM_ACCEPT
Definition: Opcodes.h:442

References Object::GetGUID(), ObjectMgr::GetLocaleString(), Quest::GetQuestId(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LOG_DEBUG, WorldSession::SendPacket(), SMSG_QUEST_CONFIRM_ACCEPT, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestFailed()

void Player::SendQuestFailed ( uint32  questId,
InventoryResult  reason = EQUIP_ERR_OK 
)
2383{
2384 if (questId)
2385 {
2387 data << uint32(questId);
2388 data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message)
2389 GetSession()->SendPacket(&data);
2390 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED");
2391 }
2392}
@ SMSG_QUESTGIVER_QUEST_FAILED
Definition: Opcodes.h:432

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTGIVER_QUEST_FAILED.

Referenced by FailQuest().

◆ SendQuestGiverStatusMultiple()

void Player::SendQuestGiverStatusMultiple ( )
protected
7689{
7690 uint32 count = 0;
7691
7693 data << uint32(count); // placeholder
7694
7695 for (GuidUnorderedSet::const_iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
7696 {
7697 uint32 questStatus = DIALOG_STATUS_NONE;
7698
7699 if ((*itr).IsAnyTypeCreature())
7700 {
7701 // need also pet quests case support
7702 Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr);
7703 if (!questgiver || questgiver->IsHostileTo(this))
7704 continue;
7705 if (!questgiver->HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER))
7706 continue;
7707
7708 questStatus = GetQuestDialogStatus(questgiver);
7709
7710 data << questgiver->GetGUID();
7711 data << uint8(questStatus);
7712 ++count;
7713 }
7714 else if ((*itr).IsGameObject())
7715 {
7716 GameObject* questgiver = GetMap()->GetGameObject(*itr);
7717 if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
7718 continue;
7719
7720 questStatus = GetQuestDialogStatus(questgiver);
7721
7722 data << questgiver->GetGUID();
7723 data << uint8(questStatus);
7724 ++count;
7725 }
7726 }
7727
7728 data.put<uint32>(0, count); // write real count
7729 GetSession()->SendPacket(&data);
7730}
@ SMSG_QUESTGIVER_STATUS_MULTIPLE
Definition: Opcodes.h:1078
QuestGiverStatus GetQuestDialogStatus(Object *questGiver)
Definition: PlayerQuest.cpp:1595

References DIALOG_STATUS_NONE, GAMEOBJECT_TYPE_QUESTGIVER, ObjectAccessor::GetCreatureOrPetOrVehicle(), Map::GetGameObject(), GameObject::GetGoType(), Object::GetGUID(), WorldObject::GetMap(), GetQuestDialogStatus(), GetSession(), Unit::HasNpcFlag(), Unit::IsHostileTo(), m_clientGUIDs, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_QUESTGIVER_STATUS_MULTIPLE, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by GiveLevel(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleQuestgiverStatusMultipleQuery(), RewardQuest(), and SendInitialPacketsAfterAddToMap().

◆ SendQuestReward()

void Player::SendQuestReward ( Quest const *  quest,
uint32  XP 
)
2358{
2359 uint32 questid = quest->GetQuestId();
2360 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = {}", questid);
2361 sGameEventMgr->HandleQuestComplete(questid);
2362 WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4 + 4 + 4 + 4 + 4));
2363 data << uint32(questid);
2364
2365 if (!IsMaxLevel())
2366 {
2367 data << uint32(XP);
2368 data << uint32(quest->GetRewOrReqMoney(GetLevel()));
2369 }
2370 else
2371 {
2372 data << uint32(0);
2373 data << uint32(quest->GetRewOrReqMoney(GetLevel()) + quest->GetRewMoneyMaxLevel());
2374 }
2375
2376 data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest)));
2377 data << uint32(quest->GetBonusTalents()); // bonus talents
2378 data << uint32(quest->GetRewArenaPoints());
2379 GetSession()->SendPacket(&data);
2380}
@ SMSG_QUESTGIVER_QUEST_COMPLETE
Definition: Opcodes.h:431
bool IsMaxLevel() const
Definition: Player.cpp:2562

References Quest::CalculateHonorGain(), Quest::GetBonusTalents(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), Quest::GetRewArenaPoints(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), GetSession(), IsMaxLevel(), LOG_DEBUG, WorldSession::SendPacket(), sGameEventMgr, and SMSG_QUESTGIVER_QUEST_COMPLETE.

Referenced by RewardQuest().

◆ SendQuestTimerFailed()

void Player::SendQuestTimerFailed ( uint32  quest_id)
2395{
2396 if (quest_id)
2397 {
2399 data << uint32(quest_id);
2400 GetSession()->SendPacket(&data);
2401 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER");
2402 }
2403}
@ SMSG_QUESTUPDATE_FAILEDTIMER
Definition: Opcodes.h:437

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_FAILEDTIMER.

Referenced by FailQuest().

◆ SendQuestUpdate()

void Player::SendQuestUpdate ( uint32  questId)
1527{
1528 uint32 zone = 0, area = 0;
1529 // xinef: fixup
1530 uint32 oldSpellId = 0;
1531
1532 SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestMapBounds(questId);
1533 if (saBounds.first != saBounds.second)
1534 {
1535 GetZoneAndAreaId(zone, area);
1536
1537 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1538 {
1539 // xinef: spell was already casted, skip different areas with same spell
1540 if (itr->second->spellId == oldSpellId)
1541 continue;
1542 if (itr->second->autocast && itr->second->IsFitToRequirements(this, zone, area))
1543 if (!HasAura(itr->second->spellId))
1544 {
1545 CastSpell(this, itr->second->spellId, true);
1546 oldSpellId = itr->second->spellId;
1547 }
1548 }
1549 }
1550
1551 saBounds = sSpellMgr->GetSpellAreaForQuestEndMapBounds(questId);
1552
1553 // xinef: fixup
1554 uint32 skipSpellId = 0;
1555 oldSpellId = 0;
1556 if (saBounds.first != saBounds.second)
1557 {
1558 if (!zone || !area)
1559 GetZoneAndAreaId(zone, area);
1560
1561 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1562 {
1563 // xinef: skip spell for which condition is already fulfilled
1564 if (itr->second->spellId == skipSpellId)
1565 continue;
1566 skipSpellId = 0;
1567
1568 // xinef: spells are sorted, if no condition is fulfilled remove aura
1569 if (oldSpellId && oldSpellId != itr->second->spellId)
1570 {
1571 RemoveAurasDueToSpell(oldSpellId);
1572 oldSpellId = 0;
1573 }
1574
1575 if (!itr->second->IsFitToRequirements(this, zone, area))
1576 {
1577 //RemoveAurasDueToSpell(itr->second->spellId);
1578 oldSpellId = itr->second->spellId;
1579 }
1580 else
1581 {
1582 skipSpellId = itr->second->spellId;
1583 oldSpellId = 0;
1584 }
1585 }
1586
1587 // xinef: check if we have something to remove yet
1588 if (oldSpellId)
1589 RemoveAurasDueToSpell(oldSpellId);
1590 }
1591
1593}
std::pair< SpellAreaForQuestMap::const_iterator, SpellAreaForQuestMap::const_iterator > SpellAreaForQuestMapBounds
Definition: SpellMgr.h:548

References Unit::CastSpell(), WorldObject::GetZoneAndAreaId(), Unit::HasAura(), Unit::RemoveAurasDueToSpell(), sSpellMgr, and UpdateForQuestWorldObjects().

Referenced by AddQuest(), RemoveActiveQuest(), RemoveRewardedQuest(), RewardQuest(), and SetQuestStatus().

◆ SendQuestUpdateAddCreatureOrGo()

void Player::SendQuestUpdateAddCreatureOrGo ( Quest const *  quest,
ObjectGuid  guid,
uint32  creatureOrGO_idx,
uint16  old_count,
uint16  add_count 
)
2457{
2458 ASSERT(old_count + add_count < 65536 && "mob/GO count store in 16 bits 2^16 = 65536 (0..65536)");
2459
2460 int32 entry = quest->RequiredNpcOrGo[ creatureOrGO_idx ];
2461 if (entry < 0)
2462 // client expected gameobject template id in form (id|0x80000000)
2463 entry = (-entry) | 0x80000000;
2464
2465 WorldPacket data(SMSG_QUESTUPDATE_ADD_KILL, (4 * 4 + 8));
2466 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_KILL");
2467 data << uint32(quest->GetQuestId());
2468 data << uint32(entry);
2469 data << uint32(old_count + add_count);
2470 data << uint32(quest->RequiredNpcOrGoCount[ creatureOrGO_idx ]);
2471 data << guid;
2472 GetSession()->SendPacket(&data);
2473
2474 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2475 if (log_slot < MAX_QUEST_LOG_SIZE)
2476 SetQuestSlotCounter(log_slot, creatureOrGO_idx, GetQuestSlotCounter(log_slot, creatureOrGO_idx) + add_count);
2477}
@ SMSG_QUESTUPDATE_ADD_KILL
Definition: Opcodes.h:439
uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const
Definition: Player.h:1497

References ASSERT, FindQuestSlot(), Quest::GetQuestId(), GetQuestSlotCounter(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, WorldSession::SendPacket(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_KILL.

Referenced by KillCreditGO(), KilledMonsterCredit(), and TalkedToCreature().

◆ SendQuestUpdateAddItem()

void Player::SendQuestUpdateAddItem ( Quest const *  quest,
uint32  item_idx,
uint16  count 
)
2448{
2450 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM");
2451 //data << quest->RequiredItemId[item_idx];
2452 //data << count;
2453 GetSession()->SendPacket(&data);
2454}
@ SMSG_QUESTUPDATE_ADD_ITEM
Definition: Opcodes.h:440

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_ADD_ITEM.

◆ SendQuestUpdateAddPlayer()

void Player::SendQuestUpdateAddPlayer ( Quest const *  quest,
uint16  old_count,
uint16  add_count 
)
2480{
2481 ASSERT(old_count + add_count < 65536 && "player count store in 16 bits");
2482
2484 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_PVP_KILL");
2485 data << uint32(quest->GetQuestId());
2486 data << uint32(old_count + add_count);
2487 data << uint32(quest->GetPlayersSlain());
2488 GetSession()->SendPacket(&data);
2489
2490 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2491 if (log_slot < MAX_QUEST_LOG_SIZE)
2493}
@ SMSG_QUESTUPDATE_ADD_PVP_KILL
Definition: Opcodes.h:1165

References ASSERT, FindQuestSlot(), Quest::GetPlayersSlain(), Quest::GetQuestId(), GetQuestSlotCounter(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, QUEST_PVP_KILL_SLOT, WorldSession::SendPacket(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_PVP_KILL.

Referenced by KilledPlayerCreditForQuest().

◆ SendRaidDifficulty()

void Player::SendRaidDifficulty ( bool  IsInGroup,
int32  forcedDifficulty = -1 
)
178{
179 uint8 val = 0x00000001;
181 data << uint32(forcedDifficulty == -1 ? GetRaidDifficulty() : forcedDifficulty);
182 data << uint32(val);
183 data << uint32(IsInGroup);
184 GetSession()->SendPacket(&data);
185}
@ MSG_SET_RAID_DIFFICULTY
Definition: Opcodes.h:1289

References GetRaidDifficulty(), GetSession(), MSG_SET_RAID_DIFFICULTY, and WorldSession::SendPacket().

Referenced by Group::AddMember(), WorldSession::HandleSetRaidDifficultyOpcode(), SendInitialPacketsAfterAddToMap(), and Group::SetRaidDifficulty().

◆ SendRaidInfo()

void Player::SendRaidInfo ( )
6521{
6522 uint32 counter = 0;
6523
6525
6526 std::size_t p_counter = data.wpos();
6527 data << uint32(counter); // placeholder
6528
6529 time_t now = GameTime::GetGameTime().count();
6530
6531 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6532 {
6533 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6534 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6535 {
6536 if (itr->second.perm)
6537 {
6538 InstanceSave* save = itr->second.save;
6539 time_t resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
6540 data << uint32(save->GetMapId()); // map id
6541 data << uint32(save->GetDifficulty()); // difficulty
6542 data << ObjectGuid::Create<HighGuid::Instance>(save->GetInstanceId()); // instance id
6543 data << uint8(1); // expired = 0
6544 data << uint8(itr->second.extended ? 1 : 0);// extended = 1
6545 data << uint32(resetTime >= now ? resetTime - now : 0); // reset time
6546 ++counter;
6547 }
6548 }
6549 }
6550 data.put<uint32>(p_counter, counter);
6551 GetSession()->SendPacket(&data);
6552}
@ SMSG_RAID_INSTANCE_INFO
Definition: Opcodes.h:746
Difficulty GetDifficulty() const
Definition: InstanceSaveMgr.h:63

References InstanceSave::GetDifficulty(), InstanceSave::GetExtendedResetTime(), GameTime::GetGameTime(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), InstanceSave::GetResetTime(), GetSession(), MAX_DIFFICULTY, ByteBuffer::put(), WorldSession::SendPacket(), sInstanceSaveMgr, SMSG_RAID_INSTANCE_INFO, and ByteBuffer::wpos().

Referenced by WorldSession::HandleRequestRaidInfoOpcode().

◆ SendRefundInfo()

void Player::SendRefundInfo ( Item item)
private
15462{
15463 // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours.
15464 item->UpdatePlayedTime(this);
15465
15466 if (!item->IsRefundable())
15467 {
15468 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15469 return;
15470 }
15471
15472 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15473 {
15474 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15475 item->SetNotRefundable(this);
15476 return;
15477 }
15478
15479 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15480 if (!iece)
15481 {
15482 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15483 return;
15484 }
15485
15486 WorldPacket data(SMSG_ITEM_REFUND_INFO_RESPONSE, 8 + 4 + 4 + 4 + 4 * 4 + 4 * 4 + 4 + 4);
15487 data << item->GetGUID(); // item guid
15488 data << uint32(item->GetPaidMoney()); // money cost
15489 data << uint32(iece->reqhonorpoints); // honor point cost
15490 data << uint32(iece->reqarenapoints); // arena point cost
15491 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15492 {
15493 data << uint32(iece->reqitem[i]);
15494 data << uint32(iece->reqitemcount[i]);
15495 }
15496 data << uint32(0);
15497 data << uint32(GetTotalPlayedTime() - item->GetPlayedTime());
15498 GetSession()->SendPacket(&data);
15499}
@ SMSG_ITEM_REFUND_INFO_RESPONSE
Definition: Opcodes.h:1232
uint32 GetTotalPlayedTime()
Definition: Player.h:1204

References Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetPlayedTime(), Item::GetRefundRecipient(), GetSession(), GetTotalPlayedTime(), Item::IsRefundable(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, WorldSession::SendPacket(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_INFO_RESPONSE, and Item::UpdatePlayedTime().

Referenced by WorldSession::HandleItemRefundInfoRequest(), and SwapItem().

◆ SendRemoveControlBar()

void Player::SendRemoveControlBar ( )
9710{
9712 data << uint64(0);
9713 GetSession()->SendPacket(&data);
9714}

References GetSession(), WorldSession::SendPacket(), and SMSG_PET_SPELLS.

Referenced by Unit::RemoveCharmedBy(), and Unit::SetMinion().

◆ SendResetFailedNotify()

void Player::SendResetFailedNotify ( uint32  mapid)
188{
190 data << uint32(mapid);
191 GetSession()->SendPacket(&data);
192}
@ SMSG_RESET_FAILED_NOTIFY
Definition: Opcodes.h:948

References GetSession(), WorldSession::SendPacket(), and SMSG_RESET_FAILED_NOTIFY.

◆ SendResetInstanceFailed()

void Player::SendResetInstanceFailed ( uint32  reason,
uint32  MapId 
)
334{
335 /*reasons for instance reset failure:
336 // 0: There are players inside the instance.
337 // 1: There are players offline in your party.
338 // 2>: There are players in your party attempting to zone into an instance.
339 */
341 data << uint32(reason);
342 data << uint32(MapId);
343 GetSession()->SendPacket(&data);
344}
@ SMSG_INSTANCE_RESET_FAILED
Definition: Opcodes.h:829

References GetSession(), WorldSession::SendPacket(), and SMSG_INSTANCE_RESET_FAILED.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendResetInstanceSuccess()

void Player::SendResetInstanceSuccess ( uint32  MapId)
327{
329 data << uint32(MapId);
330 GetSession()->SendPacket(&data);
331}
@ SMSG_INSTANCE_RESET
Definition: Opcodes.h:828

References GetSession(), WorldSession::SendPacket(), and SMSG_INSTANCE_RESET.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendRespondInspectAchievements()

void Player::SendRespondInspectAchievements ( Player player) const
13857{
13859}
void SendRespondInspectAchievements(Player *player) const
Definition: AchievementMgr.cpp:2385

References m_achievementMgr, and AchievementMgr::SendRespondInspectAchievements().

Referenced by WorldSession::HandleQueryInspectAchievements().

◆ SendSavedInstances()

void Player::SendSavedInstances ( )
6558{
6559 bool hasBeenSaved = false;
6560 WorldPacket data;
6561
6562 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6563 {
6564 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6565 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6566 {
6567 if (itr->second.perm) // only permanent binds are sent
6568 {
6569 hasBeenSaved = true;
6570 break;
6571 }
6572 }
6573 }
6574
6575 //Send opcode 811. true or false means, whether you have current raid/heroic instances
6577 data << uint32(hasBeenSaved);
6578 GetSession()->SendPacket(&data);
6579
6580 if (!hasBeenSaved)
6581 return;
6582
6583 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6584 {
6585 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6586 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6587 {
6588 if (itr->second.perm)
6589 {
6591 data << uint32(itr->second.save->GetMapId());
6592 GetSession()->SendPacket(&data);
6593 }
6594 }
6595 }
6596}
@ SMSG_UPDATE_INSTANCE_OWNERSHIP
Definition: Opcodes.h:841
@ SMSG_UPDATE_LAST_INSTANCE
Definition: Opcodes.h:830
void Initialize(uint16 opcode, std::size_t newres=200)
Definition: WorldPacket.h:68

References Object::GetGUID(), GetSession(), WorldPacket::Initialize(), MAX_DIFFICULTY, WorldSession::SendPacket(), sInstanceSaveMgr, SMSG_UPDATE_INSTANCE_OWNERSHIP, and SMSG_UPDATE_LAST_INSTANCE.

Referenced by TeleportTo().

◆ SendSellError()

void Player::SendSellError ( SellResult  msg,
Creature creature,
ObjectGuid  guid,
uint32  param 
)
4077{
4078 LOG_DEBUG("network", "WORLD: Sent SMSG_SELL_ITEM");
4079 WorldPacket data(SMSG_SELL_ITEM, (8 + 8 + (param ? 4 : 0) + 1)); // last check 2.0.10
4080 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4081 data << guid;
4082 if (param > 0)
4083 data << uint32(param);
4084 data << uint8(msg);
4085 GetSession()->SendPacket(&data);
4086}
@ SMSG_SELL_ITEM
Definition: Opcodes.h:447

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_SELL_ITEM.

Referenced by WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendSellErrorCommand(), WorldSession::HandleSellItemOpcode(), and WorldSession::SendListInventory().

◆ SendSystemMessage()

void Player::SendSystemMessage ( std::string_view  msg,
bool  escapeCharacters = false 
)
16300{
16301 ChatHandler(GetSession()).SendSysMessage(msg, escapeCharacters);
16302}

References GetSession(), and ChatHandler::SendSysMessage().

◆ SendTalentsInfoData()

◆ SendTalentWipeConfirm()

void Player::SendTalentWipeConfirm ( ObjectGuid  guid)
8892{
8893 WorldPacket data(MSG_TALENT_WIPE_CONFIRM, (8 + 4));
8894 data << guid;
8895 uint32 cost = sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : resetTalentsCost();
8896 data << cost;
8897 GetSession()->SendPacket(&data);
8898}
@ MSG_TALENT_WIPE_CONFIRM
Definition: Opcodes.h:712

References CONFIG_NO_RESET_TALENT_COST, GetSession(), MSG_TALENT_WIPE_CONFIRM, resetTalentsCost(), WorldSession::SendPacket(), and sWorld.

Referenced by Spell::EffectUntrainTalents(), and OnGossipSelect().

◆ SendTaxiNodeStatusMultiple()

void Player::SendTaxiNodeStatusMultiple ( )
10455{
10456 for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
10457 {
10458 if (!itr->IsCreature())
10459 {
10460 continue;
10461 }
10462
10463 Creature* creature = ObjectAccessor::GetCreature(*this, *itr);
10464 if (!creature || creature->IsHostileTo(this))
10465 {
10466 continue;
10467 }
10468
10469 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_FLIGHTMASTER))
10470 {
10471 continue;
10472 }
10473
10474 uint32 nearestNode = sObjectMgr->GetNearestTaxiNode(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetMapId(), GetTeamId());
10475 if (!nearestNode)
10476 {
10477 continue;
10478 }
10479
10481 data << *itr;
10482 data << uint8(m_taxi.IsTaximaskNodeKnown(nearestNode) ? 1 : 0);
10483 SendDirectMessage(&data);
10484 }
10485}
@ SMSG_TAXINODE_STATUS
Definition: Opcodes.h:457
bool IsTaximaskNodeKnown(uint32 nodeidx) const
Definition: PlayerTaxi.h:35

References ObjectAccessor::GetCreature(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTeamId(), Unit::HasNpcFlag(), Unit::IsHostileTo(), PlayerTaxi::IsTaximaskNodeKnown(), m_clientGUIDs, m_taxi, SendDirectMessage(), SMSG_TAXINODE_STATUS, sObjectMgr, and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendTeleportAckPacket()

void Player::SendTeleportAckPacket ( )
1331{
1333 data << GetPackGUID();
1334 data << uint32(0); // this value increments every time
1335 BuildMovementPacket(&data);
1336 GetSession()->SendPacket(&data);
1337}
@ MSG_MOVE_TELEPORT_ACK
Definition: Opcodes.h:229
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:19666

References Unit::BuildMovementPacket(), Object::GetPackGUID(), GetSession(), MSG_MOVE_TELEPORT_ACK, and WorldSession::SendPacket().

Referenced by TeleportTo().

◆ SendTransferAborted()

void Player::SendTransferAborted ( uint32  mapid,
TransferAbortReason  reason,
uint8  arg = 0 
)
11666{
11668 data << uint32(mapid);
11669 data << uint8(reason); // transfer abort reason
11670 switch (reason)
11671 {
11675 // these are the ONLY cases that have an extra argument in the packet!!!
11676 data << uint8(arg);
11677 break;
11678 default:
11679 break;
11680 }
11681 GetSession()->SendPacket(&data);
11682}
@ TRANSFER_ABORT_UNIQUE_MESSAGE
Definition: Player.h:797
@ TRANSFER_ABORT_INSUF_EXPAN_LVL
Definition: Player.h:795
@ SMSG_TRANSFER_ABORTED
Definition: Opcodes.h:94

References GetSession(), WorldSession::SendPacket(), SMSG_TRANSFER_ABORTED, TRANSFER_ABORT_DIFFICULTY, TRANSFER_ABORT_INSUF_EXPAN_LVL, and TRANSFER_ABORT_UNIQUE_MESSAGE.

Referenced by InstanceMap::CannotEnter(), MapMgr::PlayerCannotEnter(), Satisfy(), and TeleportTo().

◆ SendUpdateToOutOfRangeGroupMembers()

void Player::SendUpdateToOutOfRangeGroupMembers ( )
11653{
11655 return;
11656 if (Group* group = GetGroup())
11657 group->UpdatePlayerOutOfRange(this);
11658
11661 if (Pet* pet = GetPet())
11662 pet->ResetAuraUpdateMaskForRaid();
11663}
@ GROUP_UPDATE_FLAG_NONE
Definition: Group.h:99

References GetGroup(), GetPet(), GROUP_UPDATE_FLAG_NONE, m_auraRaidUpdateMask, and m_groupUpdateMask.

Referenced by Update().

◆ SendUpdateWorldState()

void Player::SendUpdateWorldState ( uint32  variable,
uint32  value 
) const
2244{
2246 worldstate.VariableID = variable;
2247 worldstate.Value = value;
2248 SendDirectMessage(worldstate.Write());
2249}
Definition: WorldStatePackets.h:50
int32 Value
Definition: WorldStatePackets.h:57
WorldPacket const * Write() override
Definition: WorldStatePackets.cpp:40
int32 VariableID
Definition: WorldStatePackets.h:56

References SendDirectMessage(), WorldPackets::WorldState::UpdateWorldState::Value, WorldPackets::WorldState::UpdateWorldState::VariableID, and WorldPackets::WorldState::UpdateWorldState::Write().

Referenced by debug_commandscript::HandleDebugUpdateWorldStateCommand(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), OPvPCapturePointEP_EWT::HandlePlayerEnter(), OPvPCapturePointEP_NPT::HandlePlayerEnter(), OPvPCapturePointEP_CGT::HandlePlayerEnter(), OPvPCapturePointEP_PWT::HandlePlayerEnter(), OPvPCapturePointGH::HandlePlayerEnter(), OPvPCapturePointHP::HandlePlayerEnter(), OPvPCapturePointNA::HandlePlayerEnter(), OPvPCapturePointTF::HandlePlayerEnter(), OPvPCapturePointZM_Beacon::HandlePlayerEnter(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), OPvPCapturePointEP_EWT::HandlePlayerLeave(), OPvPCapturePointEP_NPT::HandlePlayerLeave(), OPvPCapturePointEP_CGT::HandlePlayerLeave(), OPvPCapturePointEP_PWT::HandlePlayerLeave(), OPvPCapturePointGH::HandlePlayerLeave(), OPvPCapturePointHP::HandlePlayerLeave(), OPvPCapturePointNA::HandlePlayerLeave(), OPvPCapturePointTF::HandlePlayerLeave(), OPvPCapturePointZM_Beacon::HandlePlayerLeave(), npc_wg_queue::OnGossipHello(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnPlayerEnter(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::OnPlayerEnter(), instance_oculus::instance_oculus_InstanceMapScript::OnPlayerEnter(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::OnPlayerEnter(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), SendBGWeekendWorldStates(), OutdoorPvPEP::SendRemoveWorldStates(), OutdoorPvPGH::SendRemoveWorldStates(), OutdoorPvPHP::SendRemoveWorldStates(), OutdoorPvPNA::SendRemoveWorldStates(), OutdoorPvPSI::SendRemoveWorldStates(), OutdoorPvPTF::SendRemoveWorldStates(), OutdoorPvPZM::SendRemoveWorldStates(), and GameEventMgr::SendWorldStateUpdate().

◆ SetAcceptWhispers()

void Player::SetAcceptWhispers ( bool  on)
inline

◆ SetActiveSpec()

void Player::SetActiveSpec ( uint8  spec)
inline
1751{ m_activeSpec = spec; }

References m_activeSpec.

Referenced by ActivateSpec().

◆ SetAmmo()

void Player::SetAmmo ( uint32  item)
2493{
2494 if (!item)
2495 return;
2496
2497 // already set
2498 if (GetUInt32Value(PLAYER_AMMO_ID) == item)
2499 return;
2500
2501 // check ammo
2502 InventoryResult msg = CanUseAmmo(item);
2503 if (msg != EQUIP_ERR_OK)
2504 {
2505 SendEquipError(msg, nullptr, nullptr, item);
2506 return;
2507 }
2508
2510
2512}

References _ApplyAmmoBonuses(), CanUseAmmo(), EQUIP_ERR_OK, Object::GetUInt32Value(), PLAYER_AMMO_ID, SendEquipError(), and Unit::SetUInt32Value().

Referenced by Create(), and WorldSession::HandleSetAmmoOpcode().

◆ SetArenaPoints()

void Player::SetArenaPoints ( uint32  value)
6284{
6285 if (value > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
6286 value = sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS);
6288 if (value)
6290}
@ ITEM_ARENA_POINTS_ID
Definition: Player.h:967
@ CONFIG_MAX_ARENA_POINTS
Definition: IWorld.h:245

References AddKnownCurrency(), CONFIG_MAX_ARENA_POINTS, ITEM_ARENA_POINTS_ID, PLAYER_FIELD_ARENA_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), LoadFromDB(), and ModifyArenaPoints().

◆ SetArenaTeamIdInvited()

void Player::SetArenaTeamIdInvited ( uint32  ArenaTeamId)
inline

◆ SetArenaTeamInfoField()

void Player::SetArenaTeamInfoField ( uint8  slot,
ArenaTeamInfoType  type,
uint32  value 
)

◆ SetAtLoginFlag()

void Player::SetAtLoginFlag ( AtLoginFlags  f)
inline

◆ SetAuraUpdateMaskForRaid()

void Player::SetAuraUpdateMaskForRaid ( uint8  slot)
inline
2486{ m_auraRaidUpdateMask |= (uint64(1) << slot); }

References m_auraRaidUpdateMask.

◆ SetBankBagSlotCount()

void Player::SetBankBagSlotCount ( uint8  count)
inline

◆ SetBaseModValue()

void Player::SetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  value 
)
inline
2202{ m_auraBaseMod[modGroup][modType] = value; }

References m_auraBaseMod.

Referenced by UpdateAllCritPercentages().

◆ SetBaseRune()

void Player::SetBaseRune ( uint8  index,
RuneType  baseRune 
)
inline
2524{ m_runes->runes[index].BaseRune = baseRune; }

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by InitRunes().

◆ SetBattlegroundId()

◆ SetBattlegroundOrBattlefieldRaid()

void Player::SetBattlegroundOrBattlefieldRaid ( Group group,
int8  subgroup = -1 
)
13030{
13031 //we must move references from m_group to m_originalGroup
13032 if (GetGroup() && (GetGroup()->isBGGroup() || GetGroup()->isBFGroup()))
13033 {
13034 LOG_INFO("misc", "Player::SetBattlegroundOrBattlefieldRaid - current group is {} group!", (GetGroup()->isBGGroup() ? "BG" : "BF"));
13035 //ABORT(); // pussywizard: origanal group can never be bf/bg group
13036 }
13037
13039
13040 m_group.unlink();
13041 m_group.link(group, this);
13042 m_group.setSubGroup((uint8)subgroup);
13043}
uint8 GetSubGroup() const
Definition: Player.h:2482

References GetGroup(), GetSubGroup(), Reference< TO, FROM >::link(), LOG_INFO, m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), and Battleground::AddOrSetPlayerToCorrectBgGroup().

◆ SetBGData()

void Player::SetBGData ( BGData bgdata)
inline
2270{ m_bgData = bgdata; }

References m_bgData.

◆ SetBindPoint()

void Player::SetBindPoint ( ObjectGuid  guid)
8885{
8887 data << guid;
8888 GetSession()->SendPacket(&data);
8889}
@ SMSG_BINDER_CONFIRM
Definition: Opcodes.h:777

References GetSession(), WorldSession::SendPacket(), and SMSG_BINDER_CONFIRM.

Referenced by npc_innkeeper::OnGossipSelect(), and OnGossipSelect().

◆ SetBonusTalentCount()

void Player::SetBonusTalentCount ( uint32  count)
inline
1742{ m_extraBonusTalentCount = count; };

References m_extraBonusTalentCount.

◆ SetCanBlock()

void Player::SetCanBlock ( bool  value)
13080{
13081 if (m_canBlock == value)
13082 return;
13083
13084 m_canBlock = value;
13086}
void UpdateBlockPercentage()
Definition: StatSystem.cpp:616

References m_canBlock, and UpdateBlockPercentage().

Referenced by Spell::EffectBlock().

◆ SetCanFly()

bool Player::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
overridevirtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

movement counter

Reimplemented from Unit.

15862{
15863 sScriptMgr->AnticheatSetCanFlybyServer(this, apply);
15864
15865 if (!packetOnly && !Unit::SetCanFly(apply))
15866 return false;
15867
15868 if (!apply)
15870
15872 data << GetPackGUID();
15873 data << uint32(0);
15874 SendDirectMessage(&data);
15875
15876 data.Initialize(MSG_MOVE_UPDATE_CAN_FLY, 64);
15877 data << GetPackGUID();
15878 BuildMovementPacket(&data);
15879 SendMessageToSet(&data, false);
15880 return true;
15881}
@ MSG_MOVE_UPDATE_CAN_FLY
Definition: Opcodes.h:971
@ SMSG_MOVE_SET_CAN_FLY
Definition: Opcodes.h:865
@ SMSG_MOVE_UNSET_CAN_FLY
Definition: Opcodes.h:866
virtual bool SetCanFly(bool enable, bool packetOnly=false)
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition: Unit.cpp:20375

References Unit::BuildMovementPacket(), GameTime::GetGameTime(), Object::GetPackGUID(), Position::GetPositionZ(), WorldPacket::Initialize(), MSG_MOVE_UPDATE_CAN_FLY, SendDirectMessage(), SendMessageToSet(), Unit::SetCanFly(), SetFallInformation(), SMSG_MOVE_SET_CAN_FLY, SMSG_MOVE_UNSET_CAN_FLY, and sScriptMgr.

Referenced by Unit::KnockbackFrom().

◆ SetCanKnockback()

void Player::SetCanKnockback ( bool  value)
inline
2510{ m_canKnockback = value; }

References m_canKnockback.

Referenced by Unit::KnockbackFrom().

◆ SetCanParry()

void Player::SetCanParry ( bool  value)
13071{
13072 if (m_canParry == value)
13073 return;
13074
13075 m_canParry = value;
13077}
void UpdateParryPercentage()
Definition: StatSystem.cpp:735

References m_canParry, and UpdateParryPercentage().

Referenced by Spell::EffectParry(), and AuraEffect::HandleAuraModParryPercent().

◆ SetCanTeleport()

◆ SetCanTitanGrip()

void Player::SetCanTitanGrip ( bool  value)
13089{
13090 m_canTitanGrip = value;
13091}

References m_canTitanGrip.

Referenced by ActivateSpec(), Spell::EffectTitanGrip(), and resetTalents().

◆ SetChampioningFaction()

void Player::SetChampioningFaction ( uint32  faction)
inline
2561{ m_ChampioningFaction = faction; }

References m_ChampioningFaction.

Referenced by AuraEffect::HandleAuraDummy().

◆ setCinematic()

void Player::setCinematic ( uint8  cine)
inline
1844 {
1845 m_cinematic = cine;
1846 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ SetClientControl()

void Player::SetClientControl ( Unit target,
bool  allowMove,
bool  packetOnly = false 
)
12801{
12803 data << target->GetPackGUID();
12804 data << uint8((allowMove && !target->HasUnitState(UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED)) ? 1 : 0);
12805 GetSession()->SendPacket(&data);
12806
12807 // We want to set the packet only
12808 if (packetOnly)
12809 return;
12810
12811 if (this != target)
12812 SetViewpoint(target, allowMove);
12813
12814 if (allowMove)
12815 SetMover(target);
12816
12817 // Xinef: disable moving if target has disable move flag
12818 if (!target->IsCreature())
12819 return;
12820
12821 if (allowMove && target->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
12822 {
12824 target->SetControlled(true, UNIT_STATE_ROOT);
12825 }
12826 else if (!allowMove && target->HasUnitState(UNIT_STATE_ROOT) && !target->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
12827 {
12829 {
12830 // Xinef: restore original orientation, important for shooting vehicles!
12832 target->SetOrientation(pos.GetOrientation());
12833 target->SetFacingTo(pos.GetOrientation());
12834 target->DisableSpline();
12835 }
12836 else
12837 target->SetControlled(false, UNIT_STATE_ROOT);
12838 }
12839}
@ UNIT_MASK_ACCESSORY
Definition: UnitDefines.h:165
@ UNIT_STATE_CONFUSED
Definition: UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition: UnitDefines.h:177
@ SMSG_CLIENT_CONTROL_UPDATE
Definition: Opcodes.h:375
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:342
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:347
bool IsMOTransport() const
Definition: ObjectGuid.h:175
void SetOrientation(float orientation)
Definition: Position.h:116
void SetFacingTo(float ori)
Definition: Unit.cpp:20295
void DisableSpline()
Definition: Unit.cpp:637
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:18067
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:18789
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:696

References Unit::ClearUnitState(), Unit::DisableSpline(), Creature::GetHomePosition(), Position::GetOrientation(), Object::GetPackGUID(), GetSession(), Unit::GetTransGUID(), Creature::GetTransportHomePosition(), Unit::HasUnitFlag(), Unit::HasUnitMovementFlag(), Unit::HasUnitState(), Unit::HasUnitTypeMask(), Object::IsCreature(), ObjectGuid::IsMOTransport(), MOVEMENTFLAG_ONTRANSPORT, WorldSession::SendPacket(), Unit::SetControlled(), Unit::SetFacingTo(), SetMover(), Position::SetOrientation(), SetViewpoint(), PackedGuid::size(), SMSG_CLIENT_CONTROL_UPDATE, Object::ToCreature(), UNIT_FLAG_DISABLE_MOVE, UNIT_MASK_ACCESSORY, UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, and UNIT_STATE_ROOT.

Referenced by Battleground::BlockMovement(), WorldSession::HandleMoveTeleportAck(), npc_pilgrims_bounty_chair::PassengerBoarded(), Unit::RemoveCharmedBy(), Unit::SetCharmedBy(), Unit::SetConfused(), and Unit::SetFeared().

◆ SetCommandStatusOff()

◆ SetCommandStatusOn()

◆ SetCommentator()

void Player::SetCommentator ( bool  on)
inline

◆ SetContestedPvPTimer()

void Player::SetContestedPvPTimer ( uint32  newTime)
inline
1877{m_contestedPvPTimer = newTime;}

References m_contestedPvPTimer.

Referenced by Unit::SetContestedPvP().

◆ SetCreationTime()

void Player::SetCreationTime ( Seconds  creationTime)
inline
2548{ m_creationTime = creationTime; }

References m_creationTime.

Referenced by LoadFromDB().

◆ SetCurrentRune()

void Player::SetCurrentRune ( uint8  index,
RuneType  currentRune 
)
inline
2525{ m_runes->runes[index].CurrentRune = currentRune; }

References RuneInfo::CurrentRune, m_runes, and Runes::runes.

Referenced by ConvertRune(), and InitRunes().

◆ SetCurrentTitle()

void Player::SetCurrentTitle ( CharTitlesEntry const *  title,
bool  clear = false 
)
inline
2554{ SetUInt32Value(PLAYER_CHOSEN_TITLE, clear ? 0 : title->bit_index); };

References CharTitlesEntry::bit_index, PLAYER_CHOSEN_TITLE, and Unit::SetUInt32Value().

Referenced by SetTitle().

◆ SetDailyQuestStatus()

void Player::SetDailyQuestStatus ( uint32  quest_id)
12039{
12040 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(quest_id))
12041 {
12042 if (!qQuest->IsDFQuest())
12043 {
12044 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12045 {
12046 if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
12047 {
12048 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
12049 m_lastDailyQuestTime = GameTime::GetGameTime().count(); // last daily quest time
12050 m_DailyQuestChanged = true;
12051 break;
12052 }
12053 }
12054 }
12055 else
12056 {
12057 m_DFQuests.insert(quest_id);
12059 m_DailyQuestChanged = true;
12060 }
12061 }
12062}

References GameTime::GetGameTime(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), and sObjectMgr.

Referenced by RewardQuest().

◆ setDeathState()

void Player::setDeathState ( DeathState  s,
bool  despawn = false 
)
overridevirtual

Reimplemented from Unit.

1021{
1022 uint32 ressSpellId = 0;
1023
1024 bool cur = IsAlive();
1025
1026 if (s == DeathState::JustDied)
1027 {
1028 if (!cur)
1029 {
1030 LOG_ERROR("entities.player", "setDeathState: attempt to kill a dead player {} ({})", GetName(), GetGUID().ToString());
1031 return;
1032 }
1033
1034 // clear all pending spell cast requests when dying
1035 SpellQueue.clear();
1036
1037 // drunken state is cleared on death
1038 SetDrunkValue(0);
1039 // lost combo points at any target (targeted combo points clear in Unit::setDeathState)
1041
1043
1044 //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DeathState::Dead) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD)
1045 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
1046
1047 // save value before aura remove in Unit::setDeathState
1049
1050 // xinef: disable passive area auras!
1052
1053 // passive spell
1054 if (!ressSpellId)
1055 ressSpellId = GetResurrectionSpellId();
1059
1060 // Xinef: reset all death criterias
1062 }
1063 // xinef: enable passive area auras!
1064 else if (s == DeathState::Alive)
1066
1068
1071
1072 // restore resurrection spell id for player after aura remove
1073 if (s == DeathState::JustDied && cur && ressSpellId)
1075
1076 if (IsAlive() && !cur)
1077 //clear aura case after resurrection by another way (spells will be applied before next death)
1079}
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH
Definition: DBCEnums.h:88
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP
Definition: DBCEnums.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH
Definition: DBCEnums.h:134
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON
Definition: DBCEnums.h:135
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12560
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition: Player.cpp:13876
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14604

References ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, Unit::AddUnitState(), Unit::ClearComboPoints(), clearResurrectRequestData(), Unit::ClearUnitState(), WorldObject::FindMap(), Object::GetGUID(), WorldObject::GetName(), GetResurrectionSpellId(), Object::GetUInt32Value(), Unit::IsAlive(), LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_NOT_IN_SLOT, PLAYER_SELF_RES_SPELL, RemovePet(), ResetAchievementCriteria(), ArenaSpectator::SendCommand_UInt32Value(), Unit::setDeathState(), SetDrunkValue(), Unit::SetUInt32Value(), SpellQueue, Position::ToString(), UNIT_STATE_ISOLATED, and UpdateAchievementCriteria().

Referenced by KillPlayer(), and ResurrectPlayer().

◆ SetDeveloper()

void Player::SetDeveloper ( bool  on)
inline

◆ SetDisableGravity()

bool Player::SetDisableGravity ( bool  disable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
overridevirtual

movement counter

Reimplemented from Unit.

15845{
15846 if (!packetOnly && !Unit::SetDisableGravity(disable))
15847 return false;
15848
15850 data << GetPackGUID();
15851 data << uint32(0);
15852 SendDirectMessage(&data);
15853
15854 data.Initialize(MSG_MOVE_GRAVITY_CHNG, 64);
15855 data << GetPackGUID();
15856 BuildMovementPacket(&data);
15857 SendMessageToSet(&data, false);
15858 return true;
15859}
@ SMSG_MOVE_GRAVITY_DISABLE
Definition: Opcodes.h:1260
@ SMSG_MOVE_GRAVITY_ENABLE
Definition: Opcodes.h:1262
@ MSG_MOVE_GRAVITY_CHNG
Definition: Opcodes.h:1264
virtual bool SetDisableGravity(bool disable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20332

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_GRAVITY_CHNG, SendDirectMessage(), SendMessageToSet(), Unit::SetDisableGravity(), SMSG_MOVE_GRAVITY_DISABLE, and SMSG_MOVE_GRAVITY_ENABLE.

Referenced by npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded().

◆ SetDivider()

◆ SetDrunkValue()

void Player::SetDrunkValue ( uint8  newDrunkValue,
uint32  itemId = 0 
)
978{
979 newDrunkValue = std::min<uint8>(newDrunkValue, 100);
980 if (newDrunkValue == GetDrunkValue())
981 return;
982
984 uint32 newDrunkenState = Player::GetDrunkenstateByValue(newDrunkValue);
985
988
989 m_drunkTimer = 0; // reset sobering timer
990
991 if (newDrunkenState == oldDrunkenState)
992 return;
993
995 data.Guid = GetGUID();
996 data.Threshold = newDrunkenState;
997 data.ItemID = itemId;
998
999 SendMessageToSet(data.Write(), true);
1000}
@ PLAYER_BYTES_3_OFFSET_INEBRIATION
Definition: Player.h:535
void UpdateInvisibilityDrunkDetect()
Definition: Player.cpp:1002
static DrunkenState GetDrunkenstateByValue(uint8 value)
Definition: Player.cpp:966
WorldPacket const * Write() override
Definition: MiscPackets.cpp:113
ObjectGuid Guid
Definition: MiscPackets.h:175
uint32 Threshold
Definition: MiscPackets.h:176
uint32 ItemID
Definition: MiscPackets.h:177

References GetDrunkenstateByValue(), GetDrunkValue(), Object::GetGUID(), WorldPackets::Misc::CrossedInebriationThreshold::Guid, WorldPackets::Misc::CrossedInebriationThreshold::ItemID, m_drunkTimer, PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_INEBRIATION, SendMessageToSet(), Object::SetByteValue(), WorldPackets::Misc::CrossedInebriationThreshold::Threshold, UpdateInvisibilityDrunkDetect(), and WorldPackets::Misc::CrossedInebriationThreshold::Write().

Referenced by Spell::EffectInebriate(), HandleSobering(), LoadFromDB(), and setDeathState().

◆ SetDungeonDifficulty()

void Player::SetDungeonDifficulty ( Difficulty  dungeon_difficulty)
inline

◆ SetEntryPoint()

void Player::SetEntryPoint ( )
11233{
11236
11237 if (!m_taxi.empty())
11238 {
11241
11244 }
11245 else
11246 {
11247 if (IsMounted())
11248 {
11250 if (!auras.empty())
11251 m_entryPointData.mountSpell = (*auras.begin())->GetId();
11252 }
11253 else
11255
11256 if (GetMap()->IsDungeon())
11257 {
11258 if (const GraveyardStruct* entry = sGraveyard->GetClosestGraveyard(this, GetTeamId()))
11259 m_entryPointData.joinPos = WorldLocation(entry->Map, entry->x, entry->y, entry->z, 0.0f);
11260 }
11261 else if (!GetMap()->IsBattlegroundOrArena())
11263 }
11264
11267}
uint32 m_mapId
Definition: Position.h:323
bool empty() const
Definition: PlayerTaxi.h:73
uint32 GetTaxiDestination() const
Definition: PlayerTaxi.h:64
bool IsDungeon() const
Definition: Map.h:295
bool IsBattlegroundOrArena() const
Definition: Map.h:303

References EntryPointData::ClearTaxiPath(), PlayerTaxi::empty(), Unit::GetAuraEffectsByType(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), PlayerTaxi::GetTaxiDestination(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Map::IsBattlegroundOrArena(), Map::IsDungeon(), Unit::IsMounted(), EntryPointData::joinPos, m_entryPointData, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, WorldLocation::m_mapId, m_taxi, MAPID_INVALID, EntryPointData::mountSpell, sGraveyard, SPELL_AURA_MOUNTED, and EntryPointData::taxiPath.

Referenced by misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), and lfg::LFGMgr::TeleportPlayer().

◆ SetEquipmentSet()

void Player::SetEquipmentSet ( uint32  index,
EquipmentSet  eqset 
)
14449{
14450 if (eqset.Guid != 0)
14451 {
14452 bool found = false;
14453
14454 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14455 {
14456 if ((itr->second.Guid == eqset.Guid) && (itr->first == index))
14457 {
14458 found = true;
14459 break;
14460 }
14461 }
14462
14463 if (!found) // something wrong...
14464 {
14465 LOG_ERROR("entities.player", "Player {} tried to save equipment set {} (index {}), but that equipment set not found!", GetName(), eqset.Guid, index);
14466 return;
14467 }
14468 }
14469
14470 EquipmentSet& eqslot = m_EquipmentSets[index];
14471
14472 EquipmentSetUpdateState old_state = eqslot.state;
14473
14474 eqslot = eqset;
14475
14476 if (eqset.Guid == 0)
14477 {
14478 eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid();
14479
14481 data << uint32(index);
14482 data.appendPackGUID(eqslot.Guid);
14483 GetSession()->SendPacket(&data);
14484 }
14485
14487}
EquipmentSetUpdateState
Definition: Player.h:747
@ SMSG_EQUIPMENT_SET_SAVED
Definition: Opcodes.h:341

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_NEW, WorldObject::GetName(), GetSession(), EquipmentSet::Guid, LOG_ERROR, m_EquipmentSets, WorldSession::SendPacket(), SMSG_EQUIPMENT_SET_SAVED, sObjectMgr, and EquipmentSet::state.

Referenced by WorldSession::HandleEquipmentSetSave().

◆ SetFactionForRace()

void Player::SetFactionForRace ( uint8  race)
5871{
5872 m_team = TeamIdForRace(race);
5873
5874 sScriptMgr->OnPlayerUpdateFaction(this);
5875
5876 if (GetTeamId(true) != GetTeamId())
5877 return;
5878
5879 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
5880 SetFaction(rEntry ? rEntry->FactionID : 0);
5881}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
void SetFaction(uint32 faction)
Definition: Unit.cpp:10096
Definition: DBCStructure.h:679
uint32 FactionID
Definition: DBCStructure.h:682

References ChrRacesEntry::FactionID, GetTeamId(), m_team, sChrRacesStore, Unit::SetFaction(), sScriptMgr, and TeamIdForRace().

Referenced by Create(), reset_commandscript::HandleResetStatsOrLevelHelper(), LoadFromDB(), InstanceScript::OnPlayerLeave(), Unit::RestoreFaction(), and SetGameMaster().

◆ SetFallInformation()

◆ SetFarSightDistance()

void Player::SetFarSightDistance ( float  radius)
16212{
16213 _farSightDistance = radius;
16214}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ SetFeatherFall()

bool Player::SetFeatherFall ( bool  apply,
bool  packetOnly = false 
)
overridevirtual

movement counter

Reimplemented from Unit.

15926{
15927 // Xinef: moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15928 if (!packetOnly/* && !Unit::SetFeatherFall(apply)*/)
15929 {
15930 Unit::SetFeatherFall(apply);
15931 //return false;
15932 }
15933
15935 data << GetPackGUID();
15936 data << uint32(0);
15937 SendDirectMessage(&data);
15938
15939 data.Initialize(MSG_MOVE_FEATHER_FALL, 64);
15940 data << GetPackGUID();
15941 BuildMovementPacket(&data);
15942 SendMessageToSet(&data, false);
15943 return true;
15944}
@ SMSG_MOVE_FEATHER_FALL
Definition: Opcodes.h:272
@ SMSG_MOVE_NORMAL_FALL
Definition: Opcodes.h:273
@ MSG_MOVE_FEATHER_FALL
Definition: Opcodes.h:718
virtual bool SetFeatherFall(bool enable, bool packetOnly=false)
Definition: Unit.cpp:20419

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_FEATHER_FALL, SendDirectMessage(), SendMessageToSet(), Unit::SetFeatherFall(), SMSG_MOVE_FEATHER_FALL, and SMSG_MOVE_NORMAL_FALL.

◆ SetFreePrimaryProfessions()

void Player::SetFreePrimaryProfessions ( uint16  profs)
inline

◆ SetFreeTalentPoints()

void Player::SetFreeTalentPoints ( uint32  points)

◆ SetGameMaster()

void Player::SetGameMaster ( bool  on)
2214{
2215 if (on)
2216 {
2218 if (GetSession()->IsGMAccount())
2222
2223 if (Pet* pet = GetPet())
2224 {
2225 if (GetSession()->IsGMAccount())
2226 pet->SetFaction(FACTION_FRIENDLY);
2227 pet->getHostileRefMgr().setOnlineOfflineState(false);
2228 }
2230 {
2232 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
2233 }
2235
2238
2239 SetPhaseMask(uint32(PHASEMASK_ANYWHERE), false); // see and visible in all phases
2241 }
2242 else
2243 {
2244 // restore phase
2245 uint32 newPhase = GetPhaseByAuras();
2246
2247 if (!newPhase)
2248 newPhase = PHASEMASK_NORMAL;
2249
2250 SetPhaseMask(newPhase, false);
2251
2252 m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
2256
2257 if (Pet* pet = GetPet())
2258 {
2259 pet->SetFaction(GetFaction());
2260 pet->getHostileRefMgr().setOnlineOfflineState(true);
2261 }
2262
2263 // restore FFA PvP Server state
2264 if (sWorld->IsFFAPvPRealm())
2265 {
2267 {
2269 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, true);
2270 }
2271 }
2272 // restore FFA PvP area state, remove not allowed for GM mounts
2274
2277 }
2278
2280}
@ PHASEMASK_ANYWHERE
Definition: Object.h:62
@ UNIT_FLAG2_ALLOW_CHEAT_SPELLS
Definition: UnitDefines.h:306
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1273
@ FACTION_FRIENDLY
Definition: SharedDefines.h:201
@ SEC_PLAYER
Definition: Common.h:57
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:378
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibilityDetect
Definition: Object.h:530
void ResetContestedPvP()
Definition: Player.h:1878
void UpdateArea(uint32 newArea)
Definition: PlayerUpdates.cpp:1215
uint32 GetFaction() const
Definition: Unit.h:801
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:19082
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10498

References Unit::CombatStopWithPets(), FACTION_FRIENDLY, Unit::GetFaction(), Unit::getHostileRefMgr(), GetPet(), Unit::GetPhaseByAuras(), Unit::getRace(), GetSession(), Object::HasByteFlag(), m_areaUpdateId, m_ExtraFlags, WorldObject::m_serverSideVisibilityDetect, PHASEMASK_ANYWHERE, PHASEMASK_NORMAL, PLAYER_EXTRA_GM_ON, PLAYER_FLAGS_GM, Object::RemoveByteFlag(), RemovePlayerFlag(), Unit::RemoveUnitFlag2(), ResetContestedPvP(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, Object::SetByteFlag(), Unit::SetFaction(), SetFactionForRace(), HostileRefMgr::setOnlineOfflineState(), Unit::SetPhaseMask(), SetPlayerFlag(), Unit::SetUnitFlag2(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG2_ALLOW_CHEAT_SPELLS, UpdateArea(), and UpdateObjectVisibility().

Referenced by gm_commandscript::HandleGMOffCommand(), gm_commandscript::HandleGMOnCommand(), and LoadFromDB().

◆ SetGlyph()

void Player::SetGlyph ( uint8  slot,
uint32  glyph,
bool  save 
)
inline
1768 {
1769 m_Glyphs[m_activeSpec][slot] = glyph;
1771
1772 if (save)
1773 SetNeedToSaveGlyphs(true);
1774 }
@ PLAYER_FIELD_GLYPHS_1
Definition: UpdateFields.h:389

References m_activeSpec, m_Glyphs, PLAYER_FIELD_GLYPHS_1, SetNeedToSaveGlyphs(), and Unit::SetUInt32Value().

Referenced by _LoadGlyphAuras(), ActivateSpec(), Spell::EffectApplyGlyph(), and WorldSession::HandleRemoveGlyph().

◆ SetGlyphSlot()

void Player::SetGlyphSlot ( uint8  slot,
uint32  slottype 
)
inline

◆ SetGMChat()

void Player::SetGMChat ( bool  on)
inline
1179{ if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; }

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by LoadFromDB().

◆ SetGMVisible()

void Player::SetGMVisible ( bool  on)
2283{
2284 const uint32 VISUAL_AURA = 37800;
2285
2286 if (on)
2287 {
2288 RemoveAurasDueToSpell(VISUAL_AURA);
2289 m_ExtraFlags &= ~PLAYER_EXTRA_GM_INVISIBLE;
2291
2294 }
2295 else
2296 {
2297 AddAura(VISUAL_AURA, this);
2300 }
2301}
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:529

References Unit::AddAura(), Unit::CombatStopWithPets(), Unit::getHostileRefMgr(), GetSession(), m_ExtraFlags, WorldObject::m_serverSideVisibility, PLAYER_EXTRA_GM_INVISIBLE, Unit::RemoveAurasDueToSpell(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, HostileRefMgr::setOnlineOfflineState(), and FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue().

Referenced by gm_commandscript::HandleGMVisibleCommand(), and LoadFromDB().

◆ SetGracePeriod()

void Player::SetGracePeriod ( uint8  index,
uint32  period 
)
inline

◆ SetGrantableLevels()

void Player::SetGrantableLevels ( uint8  val)
inline

◆ SetGroup()

void Player::SetGroup ( Group group,
int8  subgroup = -1 
)
11512{
11513 if (!group)
11514 m_group.unlink();
11515 else
11516 {
11517 // never use SetGroup without a subgroup unless you specify nullptr for group
11518 ASSERT(subgroup >= 0);
11519 m_group.link(group, this);
11520 m_group.setSubGroup((uint8)subgroup);
11521 }
11522
11524}

References ASSERT, Reference< TO, FROM >::link(), m_group, GroupReference::setSubGroup(), Reference< TO, FROM >::unlink(), and UpdateObjectVisibility().

Referenced by _LoadGroup(), Group::AddMember(), Group::Disband(), and Group::RemoveMember().

◆ SetGroupInvite()

void Player::SetGroupInvite ( Group group)
inline

◆ SetGroupUpdateFlag()

◆ SetGuildIdInvited()

void Player::SetGuildIdInvited ( uint32  GuildId)
inline

◆ SetHas310Flyer()

void Player::SetHas310Flyer ( bool  on)
inline
1185{ if (on) m_ExtraFlags |= PLAYER_EXTRA_HAS_310_FLYER; else m_ExtraFlags &= ~PLAYER_EXTRA_HAS_310_FLYER; }

References m_ExtraFlags, and PLAYER_EXTRA_HAS_310_FLYER.

Referenced by _addSpell(), and Has310Flyer().

◆ SetHasDelayedTeleport()

void Player::SetHasDelayedTeleport ( bool  setting)
inlineprivate
2961{ m_bHasDelayedTeleport = setting; }

References m_bHasDelayedTeleport.

Referenced by TeleportTo(), and Update().

◆ SetHomebind()

void Player::SetHomebind ( WorldLocation const &  loc,
uint32  areaId 
)
4897{
4898 loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ);
4899 m_homebindMapId = loc.GetMapId();
4900 m_homebindAreaId = areaId;
4901
4902 // update sql homebind
4904 stmt->SetData(0, m_homebindMapId);
4905 stmt->SetData(1, m_homebindAreaId);
4906 stmt->SetData (2, m_homebindX);
4907 stmt->SetData (3, m_homebindY);
4908 stmt->SetData (4, m_homebindZ);
4909 stmt->SetData(5, GetGUID().GetCounter());
4910 CharacterDatabase.Execute(stmt);
4911}
@ CHAR_UPD_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:243

References CHAR_UPD_PLAYER_HOMEBIND, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPosition(), m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, and PreparedStatementBase::SetData().

Referenced by Spell::EffectBind().

◆ SetHonorPoints()

void Player::SetHonorPoints ( uint32  value)
6263{
6264 if (value > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
6265 {
6266 if (int32 copperPerPoint = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT))
6267 {
6268 // Only convert points on login, not when awarded honor points.
6269 if (isBeingLoaded())
6270 {
6271 int32 excessPoints = value - sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6272 ModifyMoney(excessPoints * copperPerPoint);
6273 }
6274 }
6275
6276 value = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6277 }
6279 if (value)
6281}
@ ITEM_HONOR_POINTS_ID
Definition: Player.h:966
@ CONFIG_MAX_HONOR_POINTS
Definition: IWorld.h:242
@ CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT
Definition: IWorld.h:243

References AddKnownCurrency(), CONFIG_MAX_HONOR_POINTS, CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT, isBeingLoaded(), ITEM_HONOR_POINTS_ID, ModifyMoney(), PLAYER_FIELD_HONOR_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), reset_commandscript::HandleResetHonorCommand(), LoadFromDB(), and ModifyHonorPoints().

◆ SetHover()

bool Player::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
overridevirtual

movement counter

Reimplemented from Unit.

15884{
15885 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15886 if (!packetOnly /* && !Unit::SetHover(apply)*/)
15887 {
15888 Unit::SetHover(apply);
15889 // return false;
15890 }
15891
15893 data << GetPackGUID();
15894 data << uint32(0);
15895 SendDirectMessage(&data);
15896
15897 data.Initialize(MSG_MOVE_HOVER, 64);
15898 data << GetPackGUID();
15899 BuildMovementPacket(&data);
15900 SendMessageToSet(&data, false);
15901 return true;
15902}
@ MSG_MOVE_HOVER
Definition: Opcodes.h:277
@ SMSG_MOVE_SET_HOVER
Definition: Opcodes.h:274
@ SMSG_MOVE_UNSET_HOVER
Definition: Opcodes.h:275
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20441

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_HOVER, SendDirectMessage(), SendMessageToSet(), Unit::SetHover(), SMSG_MOVE_SET_HOVER, and SMSG_MOVE_UNSET_HOVER.

◆ SetInArenaTeam()

void Player::SetInArenaTeam ( uint32  ArenaTeamId,
uint8  slot,
uint8  type 
)
inline
1916 {
1917 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
1919 }

References ARENA_TEAM_ID, ARENA_TEAM_TYPE, and SetArenaTeamInfoField().

Referenced by ArenaTeam::AddMember().

◆ SetInGameTime()

void Player::SetInGameTime ( uint32  time)
inline

◆ SetInGuild()

void Player::SetInGuild ( uint32  GuildId)
inline

◆ SetInviteForBattlegroundQueueType()

void Player::SetInviteForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId,
uint32  instanceId 
)
12230{
12231 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12232 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12233 _BgBattlegroundQueueID[i].invitedToInstance = instanceId;
12234}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BattlegroundQueue::InviteGroupToBG().

◆ SetInWater()

void Player::SetInWater ( bool  apply)
2171{
2172 if (m_isInWater == apply)
2173 return;
2174
2175 //define player in water by opcodes
2176 //move player's guid into HateOfflineList of those mobs
2177 //which can't swim and move guid back into ThreatList when
2178 //on surface.
2179 //TODO: exist also swimming mobs, and function must be symmetric to enter/leave water
2181
2182 // remove auras that need water/land
2184
2186
2187 if (InstanceScript* instance = GetInstanceScript())
2188 instance->OnPlayerInWaterStateUpdate(this, apply);
2189}
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition: SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition: SpellDefines.h:51
void updateThreatTables()
Definition: HostileRefMgr.cpp:111

References AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, Unit::getHostileRefMgr(), WorldObject::GetInstanceScript(), m_isInWater, Unit::RemoveAurasWithInterruptFlags(), and HostileRefMgr::updateThreatTables().

Referenced by WorldSession::HandleMovementOpcodes().

◆ SetIsSpectator()

void Player::SetIsSpectator ( bool  on)
15298{
15299 if (on)
15300 {
15304 //SetFaction(1100);
15307 {
15309 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
15310 }
15312 SetDisplayId(23691);
15313 }
15314 else
15315 {
15317 if (IsSpectator())
15319 m_ExtraFlags &= ~PLAYER_EXTRA_SPECTATOR_ON;
15322
15323 if (!IsGameMaster())
15324 {
15325 //SetFactionForRace(getRace());
15326
15327 // restore FFA PvP Server state
15328 // Xinef: it will be removed if necessery in UpdateArea called in WorldPortOpcode
15329 if (sWorld->IsFFAPvPRealm())
15330 {
15332 {
15334 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, true);
15335
15336 }
15337 }
15338 }
15339 }
15340}
#define SPECTATOR_SPELL_SPEED
Definition: ArenaSpectator.h:39
void RestoreDisplayId()
Definition: Unit.cpp:16808

References Unit::AddAura(), Unit::AddUnitState(), Unit::ClearUnitState(), Object::HasByteFlag(), IsGameMaster(), IsSpectator(), m_ExtraFlags, PLAYER_EXTRA_SPECTATOR_ON, Unit::RemoveAurasDueToSpell(), Object::RemoveByteFlag(), Unit::RemoveUnitFlag(), ResetContestedPvP(), Unit::RestoreDisplayId(), Object::SetByteFlag(), Unit::SetDisplayId(), Unit::SetUnitFlag(), SPECTATOR_SPELL_SPEED, sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, and UNIT_STATE_ISOLATED.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetLastPetNumber()

void Player::SetLastPetNumber ( uint32  petnumber)
inline
2468{ m_lastpetnumber = petnumber; }

References m_lastpetnumber.

Referenced by Pet::LoadPetFromDB().

◆ SetLastPetSpell()

void Player::SetLastPetSpell ( uint32  petspell)
inline
2470{ m_oldpetspell = petspell; }

References m_oldpetspell.

Referenced by Pet::LoadPetFromDB(), and UnsummonPetTemporaryIfAny().

◆ SetLastPotionId()

void Player::SetLastPotionId ( uint32  item_id)
inline
1821{ m_lastPotionId = item_id; }

References m_lastPotionId.

Referenced by Spell::SendSpellCooldown(), and UpdatePotionCooldown().

◆ SetLastUsedRune()

void Player::SetLastUsedRune ( RuneType  type)
inline
2523{ m_runes->lastUsedRune = type; }

References Runes::lastUsedRune, and m_runes.

Referenced by Spell::TakeRunePower().

◆ SetLootGUID()

void Player::SetLootGUID ( ObjectGuid  guid)
inline
2003{ m_lootGuid = guid; }

References m_lootGuid.

Referenced by WorldSession::DoLootRelease(), and SendLoot().

◆ SetMap()

void Player::SetMap ( Map map)
overridevirtual

Reimplemented from WorldObject.

14618{
14619 Unit::SetMap(map);
14620 m_mapRef.link(map, this);
14621}
virtual void SetMap(Map *map)
Definition: Object.cpp:2116

References Reference< TO, FROM >::link(), m_mapRef, and WorldObject::SetMap().

Referenced by Map::AddPlayerToMap(), Create(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleSetRaidDifficultyOpcode(), and LoadFromDB().

◆ SetMoney()

void Player::SetMoney ( uint32  value)
inline

◆ SetMonthlyQuestStatus()

void Player::SetMonthlyQuestStatus ( uint32  quest_id)
12097{
12098 m_monthlyquests.insert(quest_id);
12099 m_MonthlyQuestChanged = true;
12100}

References m_MonthlyQuestChanged, and m_monthlyquests.

Referenced by RewardQuest().

◆ SetMountBlockId()

void Player::SetMountBlockId ( uint32  mount)
inline

◆ SetMovement()

void Player::SetMovement ( PlayerMovementType  pType)
4401{
4402 WorldPacket data;
4403 switch (pType)
4404 {
4405 case MOVE_ROOT:
4406 data.Initialize(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
4407 break;
4408 case MOVE_UNROOT:
4409 data.Initialize(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4);
4410 break;
4411 case MOVE_WATER_WALK:
4412 data.Initialize(SMSG_MOVE_WATER_WALK, GetPackGUID().size() + 4);
4413 break;
4414 case MOVE_LAND_WALK:
4415 data.Initialize(SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4);
4416 break;
4417 default:
4418 LOG_ERROR("entities.player", "Player::SetMovement: Unsupported move type ({}), data not sent to client.", pType);
4419 return;
4420 }
4421 data << GetPackGUID();
4422 data << uint32(0);
4423 GetSession()->SendPacket(&data);
4424}
@ SMSG_MOVE_LAND_WALK
Definition: Opcodes.h:253
@ SMSG_MOVE_WATER_WALK
Definition: Opcodes.h:252
@ SMSG_FORCE_MOVE_UNROOT
Definition: Opcodes.h:264

References Object::GetPackGUID(), GetSession(), WorldPacket::Initialize(), LOG_ERROR, MOVE_LAND_WALK, MOVE_ROOT, MOVE_UNROOT, MOVE_WATER_WALK, WorldSession::SendPacket(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), WorldSession::HandlePlayerLoginFromDB(), cheat_commandscript::HandleWaterWalkCheatCommand(), KillPlayer(), ResurrectPlayer(), and SendInitialPacketsAfterAddToMap().

◆ SetMover()

void Player::SetMover ( Unit target)
12842{
12843 if (this != target && target->m_movedByPlayer && target->m_movedByPlayer != target && target->m_movedByPlayer != this)
12844 {
12845 LOG_INFO("misc", "Player::SetMover (A1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12846 LOG_INFO("misc", "Player::SetMover (A2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12847 LOG_INFO("misc", "Player::SetMover (A3) - {}, {}, {}, {}, {}, {}, {}, {}", target->m_movedByPlayer->GetGUID().ToString(), target->m_movedByPlayer->GetMapId(), target->m_movedByPlayer->GetInstanceId(), target->m_movedByPlayer->FindMap()->GetId(), target->m_movedByPlayer->IsInWorld() ? 1 : 0, target->m_movedByPlayer->IsDuringRemoveFromWorld() ? 1 : 0, target->m_movedByPlayer->ToPlayer()->IsBeingTeleported() ? 1 : 0, target->m_movedByPlayer->isBeingLoaded() ? 1 : 0);
12848 }
12849 if (this != target && (!target->IsInWorld() || target->IsDuringRemoveFromWorld() || GetMapId() != target->GetMapId() || GetInstanceId() != target->GetInstanceId()))
12850 {
12851 LOG_INFO("misc", "Player::SetMover (B1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12852 LOG_INFO("misc", "Player::SetMover (B2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12853 }
12854 m_mover->m_movedByPlayer = nullptr;
12855 if (m_mover->IsCreature())
12857
12858 m_mover = target;
12859 m_mover->m_movedByPlayer = this;
12860 if (m_mover->IsCreature())
12862}
virtual bool isBeingLoaded() const
Definition: Unit.h:657
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:658
void Initialize()
Definition: MotionMaster.cpp:73

References WorldObject::FindMap(), Object::GetGUID(), Map::GetId(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), MotionMaster::Initialize(), Unit::isBeingLoaded(), isBeingLoaded(), IsBeingTeleported(), Object::IsCreature(), Unit::IsDuringRemoveFromWorld(), Object::IsInWorld(), LOG_INFO, Unit::m_movedByPlayer, m_mover, Object::ToPlayer(), ObjectGuid::ToString(), and Position::ToString().

Referenced by SendInitialPacketsBeforeAddToMap(), and SetClientControl().

◆ SetMustDelayTeleport()

void Player::SetMustDelayTeleport ( bool  setting)
inlineprivate
2959{ m_bMustDelayTeleport = setting; }

References m_bMustDelayTeleport.

Referenced by RewardQuest(), and Update().

◆ SetNeedToSaveGlyphs()

void Player::SetNeedToSaveGlyphs ( bool  val)
inline
2612{ m_NeedToSaveGlyphs = val; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs(), and SetGlyph().

◆ SetNeedZoneUpdate()

void Player::SetNeedZoneUpdate ( bool  needUpdate)
inline
1868{ m_needZoneUpdate = needUpdate; }

References m_needZoneUpdate.

Referenced by WorldSession::HandleZoneUpdateOpcode().

◆ SetObjectScale()

void Player::SetObjectScale ( float  scale)
inlineoverridevirtual

Reimplemented from Object.

1097 {
1098 Unit::SetObjectScale(scale);
1101 }
#define DEFAULT_WORLD_OBJECT_SIZE
Definition: ObjectDefines.h:45
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:46
@ UNIT_FIELD_COMBATREACH
Definition: UpdateFields.h:123
@ UNIT_FIELD_BOUNDINGRADIUS
Definition: UpdateFields.h:122
virtual void SetObjectScale(float scale)
Definition: Object.h:120

References DEFAULT_COMBAT_REACH, DEFAULT_WORLD_OBJECT_SIZE, Object::SetFloatValue(), Object::SetObjectScale(), UNIT_FIELD_BOUNDINGRADIUS, and UNIT_FIELD_COMBATREACH.

Referenced by Create(), InitStatsForLevel(), and LoadFromDB().

◆ SetOriginalGroup()

void Player::SetOriginalGroup ( Group group,
int8  subgroup = -1 
)
13058{
13059 if (!group)
13061 else
13062 {
13063 // never use SetOriginalGroup without a subgroup unless you specify nullptr for group
13064 ASSERT(subgroup >= 0);
13065 m_originalGroup.link(group, this);
13067 }
13068}

References ASSERT, Reference< TO, FROM >::link(), m_originalGroup, GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Group::Disband(), RemoveFromBattlegroundOrBattlefieldRaid(), Group::RemoveMember(), and SetBattlegroundOrBattlefieldRaid().

◆ SetPassOnGroupLoot()

void Player::SetPassOnGroupLoot ( bool  bPassOnGroupLoot)
inline
2498{ m_bPassOnGroupLoot = bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by WorldSession::HandleOptOutOfLootOpcode().

◆ SetPendingBind()

void Player::SetPendingBind ( uint32  instanceId,
uint32  bindTimer 
)
inline

◆ SetPendingSpectatorForBG()

void Player::SetPendingSpectatorForBG ( uint32  bgInstanceId)
inline

◆ SetPendingSpectatorInviteInstanceId()

void Player::SetPendingSpectatorInviteInstanceId ( uint32  bgInstanceId)
inline

◆ SetPlayerFlag()

◆ SetPvP()

void Player::SetPvP ( bool  state)
inline
1859 {
1860 Unit::SetPvP(state);
1861 if (!m_Controlled.empty())
1862 for (auto& itr : m_Controlled)
1863 itr->SetPvP(state);
1864 }
ControlSet m_Controlled
Definition: Unit.h:1980
void SetPvP(bool state)
Definition: Unit.h:983

References Unit::m_Controlled, and Unit::SetPvP().

Referenced by UpdatePvP().

◆ SetPvPDeath()

void Player::SetPvPDeath ( bool  on)
inline
1186{ if (on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; }

References m_ExtraFlags, and PLAYER_EXTRA_PVP_DEATH.

Referenced by CreateCorpse().

◆ SetQuestSlot()

◆ SetQuestSlotCounter()

void Player::SetQuestSlotCounter ( uint16  slot,
uint8  counter,
uint16  count 
)
inline

◆ SetQuestSlotState()

void Player::SetQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ SetQuestSlotTimer()

void Player::SetQuestSlotTimer ( uint16  slot,
uint32  timer 
)
inline

◆ SetQuestStatus()

void Player::SetQuestStatus ( uint32  questId,
QuestStatus  status,
bool  update = true 
)
1480{
1481 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
1482 {
1483 m_QuestStatus[questId].Status = status;
1484
1485 if (quest->GetQuestMethod() && !quest->IsAutoComplete())
1486 {
1487 m_QuestStatusSave[questId] = true;
1488 }
1489 }
1490
1491 if (update)
1492 SendQuestUpdate(questId);
1493}

References m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), and sObjectMgr.

Referenced by CompleteQuest(), FailQuest(), IncompleteQuest(), and npc_finklestein::npc_finklesteinAI::RightClickCauldron().

◆ SetRaidDifficulty()

void Player::SetRaidDifficulty ( Difficulty  raid_difficulty)
inline

◆ SetRandomWinner()

void Player::SetRandomWinner ( bool  isWinner)
15648{
15649 m_IsBGRandomWinner = isWinner;
15651 {
15653 stmt->SetData(0, GetGUID().GetCounter());
15654 CharacterDatabase.Execute(stmt);
15655 }
15656}
@ CHAR_INS_BATTLEGROUND_RANDOM
Definition: CharacterDatabase.h:64

References CHAR_INS_BATTLEGROUND_RANDOM, CharacterDatabase, Object::GetGUID(), m_IsBGRandomWinner, and PreparedStatementBase::SetData().

◆ SetRank()

void Player::SetRank ( uint8  rankId)
inline

◆ setRegenTimerCount()

void Player::setRegenTimerCount ( uint32  time)
inline
1614{m_regenTimerCount = time;}

References m_regenTimerCount.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetRegularAttackTime()

void Player::SetRegularAttackTime ( )
5302{
5303 for (uint8 i = 0; i < MAX_ATTACK; ++i)
5304 {
5305 Item* tmpitem = GetWeaponForAttack(WeaponAttackType(i), true);
5306 if (tmpitem && !tmpitem->IsBroken())
5307 {
5308 ItemTemplate const* proto = tmpitem->GetTemplate();
5309 if (proto->Delay)
5311 }
5312 else
5313 SetAttackTime(WeaponAttackType(i), BASE_ATTACK_TIME); // If there is no weapon reset attack time to base (might have been changed from forms)
5314 }
5315}

References BASE_ATTACK_TIME, ItemTemplate::Delay, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), MAX_ATTACK, and Unit::SetAttackTime().

Referenced by InitDataForForm().

◆ SetReputation()

void Player::SetReputation ( uint32  factionentry,
float  value 
)
15276{
15277 GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
15278}
bool SetReputation(FactionEntry const *factionEntry, float standing)
Definition: ReputationMgr.h:113

References GetReputationMgr(), ReputationMgr::SetReputation(), and sFactionStore.

◆ SetRestBonus()

void Player::SetRestBonus ( float  restBonusNew)
10148{
10149 // Prevent resting on max level
10150 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
10151 restBonusNew = 0;
10152
10153 if (restBonusNew < 0)
10154 restBonusNew = 0;
10155
10156 // Fetch rest bonus multiplier from cached configuration
10157 float restBonusMultiplier = sWorld->getRate(RATE_REST_MAX_BONUS);
10158
10159 // Calculate rest bonus max using the multiplier
10160 float restBonusMax = (float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) * restBonusMultiplier / 2;
10161
10162 if (restBonusNew > restBonusMax)
10163 _restBonus = restBonusMax;
10164 else
10165 _restBonus = restBonusNew;
10166 // update data for client
10167 if ((GetsRecruitAFriendBonus(true) && (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0)))
10169 else
10170 {
10171 if (_restBonus > 10)
10173 else if (_restBonus <= 1)
10175 }
10176
10177 //RestTickUpdate
10179}
@ PLAYER_REST_STATE_EXPERIENCE
Definition: UpdateFields.h:358
@ REST_STATE_RESTED
Definition: Player.h:990
@ RATE_REST_MAX_BONUS
Definition: IWorld.h:510

References _restBonus, CONFIG_MAX_PLAYER_LEVEL, Unit::GetLevel(), GetSession(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), PLAYER_BYTES_2, PLAYER_NEXT_LEVEL_XP, PLAYER_REST_STATE_EXPERIENCE, RATE_REST_MAX_BONUS, REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, REST_STATE_RESTED, Object::SetByteValue(), Unit::SetUInt32Value(), and sWorld.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ SetRestFlag()

void Player::SetRestFlag ( RestFlag  restFlag,
uint32  triggerId = 0 
)
16092{
16093 uint32 oldRestMask = _restFlagMask;
16094 _restFlagMask |= restFlag;
16095
16096 if (!oldRestMask && _restFlagMask) // only set flag/time on the first rest state
16097 {
16098 _restTime = GameTime::GetGameTime().count();
16100 }
16101
16102 if (triggerId)
16103 _innTriggerId = triggerId;
16104}

References _innTriggerId, _restFlagMask, _restTime, GameTime::GetGameTime(), PLAYER_FLAGS_RESTING, and SetPlayerFlag().

Referenced by WorldSession::HandleAreaTriggerOpcode(), LoadFromDB(), UpdateArea(), and UpdateZone().

◆ SetRestState()

void Player::SetRestState ( uint32  triggerId)

◆ setResurrectRequestData()

void Player::setResurrectRequestData ( ObjectGuid  guid,
uint32  mapId,
float  X,
float  Y,
float  Z,
uint32  health,
uint32  mana 
)
inline

◆ SetRewardedQuest()

void Player::SetRewardedQuest ( uint32  quest_id)
881{
882 m_RewardedQuests.insert(quest_id);
883 m_RewardedQuestsSave[quest_id] = true;
884}

References m_RewardedQuests, and m_RewardedQuestsSave.

Referenced by Spell::EffectQuestComplete(), and RewardQuest().

◆ SetRuneConvertAura()

void Player::SetRuneConvertAura ( uint8  index,
AuraEffect const *  aura 
)
inline

◆ SetRuneCooldown()

void Player::SetRuneCooldown ( uint8  index,
uint32  cooldown 
)
inline

◆ setRuneWeaponGUID()

void Player::setRuneWeaponGUID ( ObjectGuid  guid)
inline
2602{ m_drwGUID = guid; };

References m_drwGUID.

◆ SetSaveTimer()

void Player::SetSaveTimer ( uint32  timer)
inline
2366{ m_nextSave = timer; }

References m_nextSave.

◆ SetSeasonalQuestStatus()

void Player::SetSeasonalQuestStatus ( uint32  quest_id)
12087{
12088 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
12089 if (!quest)
12090 return;
12091
12092 m_seasonalquests[quest->GetEventIdForQuest()].insert(quest_id);
12094}
uint16 GetEventIdForQuest() const
Definition: QuestDef.h:332

References Quest::GetEventIdForQuest(), m_SeasonalQuestChanged, m_seasonalquests, and sObjectMgr.

Referenced by RewardQuest().

◆ SetSeer()

void Player::SetSeer ( WorldObject target)
inline
2359{ m_seer = target; }

References m_seer.

Referenced by WorldSession::HandleFarSightOpcode(), and SetViewpoint().

◆ SetSelection()

void Player::SetSelection ( ObjectGuid  guid)

Used for serverside target changes, does not apply to players.

11504{
11506
11509}
void SendCommand_GUID(T *o, ObjectGuid targetGUID, const char *prefix, ObjectGuid t)
Definition: ArenaSpectator.h:71

References WorldObject::FindMap(), Object::GetGUID(), NeedSendSpectatorData(), ArenaSpectator::SendCommand_GUID(), Object::SetGuidValue(), and UNIT_FIELD_TARGET.

Referenced by WorldSession::HandleSetSelectionOpcode(), and TeleportTo().

◆ SetSemaphoreTeleportFar()

void Player::SetSemaphoreTeleportFar ( time_t  tm)
inline

◆ SetSemaphoreTeleportNear()

void Player::SetSemaphoreTeleportNear ( time_t  tm)
inline

◆ SetServerSideVisibility()

void Player::SetServerSideVisibility ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16198{
16199 sScriptMgr->OnPlayerSetServerSideVisibility(this, type, sec);
16200
16202}

References WorldObject::m_serverSideVisibility, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetServerSideVisibilityDetect()

void Player::SetServerSideVisibilityDetect ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16205{
16206 sScriptMgr->OnPlayerSetServerSideVisibilityDetect(this, type, sec);
16207
16209}

References WorldObject::m_serverSideVisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetSession()

void Player::SetSession ( WorldSession sess)
inline
2008{ m_session = sess; }

References m_session.

Referenced by WorldSession::HandlePlayerLoginOpcode().

◆ SetSheath()

void Player::SetSheath ( SheathState  sheathed)
overridevirtual

Reimplemented from Unit.

98{
99 switch (sheathed)
100 {
101 case SHEATH_STATE_UNARMED: // no prepared weapon
102 SetVirtualItemSlot(0, nullptr);
103 SetVirtualItemSlot(1, nullptr);
104 SetVirtualItemSlot(2, nullptr);
105 break;
106 case SHEATH_STATE_MELEE: // prepared melee weapon
109 SetVirtualItemSlot(2, nullptr);
110 break;
111 case SHEATH_STATE_RANGED: // prepared ranged weapon
112 SetVirtualItemSlot(0, nullptr);
113 SetVirtualItemSlot(1, nullptr);
115 break;
116 default:
117 SetVirtualItemSlot(0, nullptr);
118 SetVirtualItemSlot(1, nullptr);
119 SetVirtualItemSlot(2, nullptr);
120 break;
121 }
122 Unit::SetSheath(sheathed); // this must visualize Sheath changing for other players...
123}
@ SHEATH_STATE_UNARMED
Definition: UnitDefines.h:126
@ SHEATH_STATE_MELEE
Definition: UnitDefines.h:127
@ SHEATH_STATE_RANGED
Definition: UnitDefines.h:128
void SetVirtualItemSlot(uint8 i, Item *item)
Definition: PlayerStorage.cpp:77
virtual void SetSheath(SheathState sheathed)
Definition: Unit.h:1683

References BASE_ATTACK, GetWeaponForAttack(), OFF_ATTACK, RANGED_ATTACK, Unit::SetSheath(), SetVirtualItemSlot(), SHEATH_STATE_MELEE, SHEATH_STATE_RANGED, and SHEATH_STATE_UNARMED.

Referenced by WorldSession::HandleSetSheathedOpcode().

◆ SetShowDKPet()

void Player::SetShowDKPet ( bool  on)
inline

◆ SetSkill()

void Player::SetSkill ( uint16  id,
uint16  step,
uint16  currVal,
uint16  maxVal 
)
5338{
5339 if (!id)
5340 return;
5341
5342 uint16 currVal;
5343 SkillStatusMap::iterator itr = mSkillStatus.find(id);
5344
5345 //has skill
5346 if (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED)
5347 {
5348 currVal = SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos)));
5349 if (newVal)
5350 {
5351 // if skill value is going down, update enchantments before setting the new value
5352 if (newVal < currVal)
5353 UpdateSkillEnchantments(id, currVal, newVal);
5354 // update step
5355 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), MAKE_PAIR32(id, step));
5356 // update value
5357 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), MAKE_SKILL_VALUE(newVal, maxVal));
5358 if (itr->second.uState != SKILL_NEW)
5359 itr->second.uState = SKILL_CHANGED;
5360 learnSkillRewardedSpells(id, newVal);
5361 // if skill value is going up, update enchantments after setting the new value
5362 if (newVal > currVal)
5363 UpdateSkillEnchantments(id, currVal, newVal);
5366 }
5367 else //remove
5368 {
5369 //remove enchantments needing this skill
5370 UpdateSkillEnchantments(id, currVal, 0);
5371 // clear skill fields
5372 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), 0);
5373 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), 0);
5374 SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos), 0);
5375
5376 // mark as deleted or simply remove from map if not saved yet
5377 if (itr->second.uState != SKILL_NEW)
5378 itr->second.uState = SKILL_DELETED;
5379 else
5380 mSkillStatus.erase(itr);
5381
5382 // remove all spells that related to this skill
5384 removeSpell(sSpellMgr->GetFirstSpellInChain(pAbility->Spell), SPEC_MASK_ALL, false);
5385 }
5386 }
5387 else if (newVal) //add
5388 {
5389 currVal = 0;
5390 for (int i = 0; i < PLAYER_MAX_SKILLS; ++i)
5392 {
5393 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(id);
5394 if (!pSkill)
5395 {
5396 LOG_ERROR("entities.player", "Skill not found in SkillLineStore: skill #{}", id);
5397 return;
5398 }
5399
5402 UpdateSkillEnchantments(id, currVal, newVal);
5403
5404 // insert new entry or update if not deleted old entry yet
5405 if (itr != mSkillStatus.end())
5406 {
5407 itr->second.pos = i;
5408 itr->second.uState = SKILL_CHANGED;
5409 }
5410 else
5411 mSkillStatus.insert(SkillStatusMap::value_type(id, SkillStatusData(i, SKILL_NEW)));
5412
5413 // apply skill bonuses
5415
5416 // temporary bonuses
5418 for (AuraEffectList::const_iterator j = mModSkill.begin(); j != mModSkill.end(); ++j)
5419 if ((*j)->GetMiscValue() == int32(id))
5420 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5421
5422 // permanent bonuses
5424 for (AuraEffectList::const_iterator j = mModSkillTalent.begin(); j != mModSkillTalent.end(); ++j)
5425 if ((*j)->GetMiscValue() == int32(id))
5426 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5427
5428 // Learn all spells for skill
5429 learnSkillRewardedSpells(id, newVal);
5432 return;
5433 }
5434 }
5435}
@ SPELL_AURA_MOD_SKILL
Definition: SpellAuraDefines.h:93
@ SPELL_AURA_MOD_SKILL_TALENT
Definition: SpellAuraDefines.h:161
@ AURA_EFFECT_HANDLE_SKILL
Definition: SpellAuraDefines.h:47
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL
Definition: DBCEnums.h:125
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL
Definition: DBCEnums.h:154
void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value)
Definition: PlayerStorage.cpp:4681

References ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, AURA_EFFECT_HANDLE_SKILL, Unit::GetAuraEffectsByType(), GetSkillLineAbilitiesBySkillLine(), Object::GetUInt32Value(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, removeSpell(), Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_NEW, SKILL_VALUE, SPEC_MASK_ALL, SPELL_AURA_MOD_SKILL, SPELL_AURA_MOD_SKILL_TALENT, sSkillLineStore, sSpellMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by _addSpell(), Spell::EffectLearnSkill(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllRecipesCommand(), misc_commandscript::HandleSetSkillCommand(), WorldSession::HandleUnlearnSkillOpcode(), LearnDefaultSkill(), and removeSpell().

◆ SetSpecsCount()

void Player::SetSpecsCount ( uint8  count)
inline
1753{ m_specsCount = count; }

References m_specsCount.

Referenced by UpdateSpecCount().

◆ SetSpellModTakingSpell()

void Player::SetSpellModTakingSpell ( Spell spell,
bool  apply 
)
10026{
10027 if (apply && m_spellModTakingSpell)
10028 {
10029 LOG_INFO("misc", "Player::SetSpellModTakingSpell (A1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10030 return;
10031 //ASSERT(m_spellModTakingSpell == nullptr);
10032 }
10033 else if (!apply)
10034 {
10036 LOG_INFO("misc", "Player::SetSpellModTakingSpell (B1) - {}", spell->m_spellInfo->Id);
10037 else if (m_spellModTakingSpell != spell)
10038 {
10039 LOG_INFO("misc", "Player::SetSpellModTakingSpell (C1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10040 return;
10041 }
10042 //ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell);
10043 }
10044
10045 m_spellModTakingSpell = apply ? spell : nullptr;
10046}

References SpellInfo::Id, LOG_INFO, Spell::m_spellInfo, and m_spellModTakingSpell.

Referenced by Spell::_cast(), Spell::cast(), Spell::handle_delayed(), Unit::HandleDummyAuraProc(), and Aura::UpdateOwner().

◆ SetSummonAsSpectator()

void Player::SetSummonAsSpectator ( bool  on)
inline

◆ SetSummonPoint()

void Player::SetSummonPoint ( uint32  mapid,
float  x,
float  y,
float  z,
uint32  delay = 0,
bool  asSpectator = false 
)
16260{
16261 m_summon_expire = GameTime::GetGameTime().count() + (delay ? delay : MAX_PLAYER_SUMMON_DELAY);
16262 m_summon_mapid = mapid;
16263 m_summon_x = x;
16264 m_summon_y = y;
16265 m_summon_z = z;
16266 m_summon_asSpectator = asSpectator;
16267}
#define MAX_PLAYER_SUMMON_DELAY
Definition: Player.h:935

References GameTime::GetGameTime(), m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, and MAX_PLAYER_SUMMON_DELAY.

Referenced by Spell::EffectSummonPlayer(), and Spell::EffectSummonRaFFriend().

◆ SetTarget()

void Player::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
inlineoverridevirtual

Implements Unit.

1647{ }

◆ SetTaxiCheater()

void Player::SetTaxiCheater ( bool  on)
inline

◆ setTeamId()

void Player::setTeamId ( TeamId  teamid)
inline
2120{ m_team = teamid; };

References m_team.

◆ SetTemporaryUnsummonedPetNumber()

void Player::SetTemporaryUnsummonedPetNumber ( uint32  petnumber)
inline

◆ SetTitle()

void Player::SetTitle ( CharTitlesEntry const *  title,
bool  lost = false 
)
13281{
13282 uint32 fieldIndexOffset = title->bit_index / 32;
13283 uint32 flag = 1 << (title->bit_index % 32);
13284
13285 if (lost)
13286 {
13287 if (!HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13288 return;
13289
13290 // Clear the current title if it is the one being removed.
13291 if (title->bit_index == GetUInt32Value(PLAYER_CHOSEN_TITLE))
13292 {
13293 SetCurrentTitle(nullptr, true);
13294 }
13295
13296 RemoveFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13297 }
13298 else
13299 {
13300 if (HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13301 return;
13302
13303 SetFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13304 }
13305
13306 WorldPacket data(SMSG_TITLE_EARNED, 4 + 4);
13307 data << uint32(title->bit_index);
13308 data << uint32(lost ? 0 : 1); // 1 - earned, 0 - lost
13309 GetSession()->SendPacket(&data);
13310
13312}
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK
Definition: DBCEnums.h:158
@ SMSG_TITLE_EARNED
Definition: Opcodes.h:913
void SetCurrentTitle(CharTitlesEntry const *title, bool clear=false)
Definition: Player.h:2554

References ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK, CharTitlesEntry::bit_index, GetSession(), Object::GetUInt32Value(), Object::HasFlag(), PLAYER__FIELD_KNOWN_TITLES, PLAYER_CHOSEN_TITLE, Object::RemoveFlag(), WorldSession::SendPacket(), SetCurrentTitle(), Object::SetFlag(), SMSG_TITLE_EARNED, and UpdateAchievementCriteria().

Referenced by _LoadQuestStatusRewarded(), AchievementMgr::CompletedAchievement(), titles_commandscript::HandleTitlesAddCommand(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), AchievementMgr::LoadFromDB(), and RewardQuest().

◆ SetViewpoint()

void Player::SetViewpoint ( WorldObject target,
bool  apply 
)
13115{
13116 if (apply)
13117 {
13118 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} create seer {} (TypeId: {}).", GetName(), target->GetEntry(), target->GetTypeId());
13119
13120 if (!AddGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13121 {
13122 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot add new viewpoint!", GetName());
13123 return;
13124 }
13125
13126 // farsight dynobj or puppet may be very far away
13127 UpdateVisibilityOf(target);
13128
13129 if (target->IsUnit() && !GetVehicle())
13130 ((Unit*)target)->AddPlayerToVision(this);
13131 SetSeer(target);
13132 }
13133 else
13134 {
13135 //must immediately set seer back otherwise may crash
13136 m_seer = this;
13137
13138 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} remove seer", GetName());
13139
13140 if (!RemoveGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13141 {
13142 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot remove current viewpoint!", GetName());
13143 return;
13144 }
13145
13146 if (target->IsUnit() && !GetVehicle())
13147 static_cast<Unit*>(target)->RemovePlayerFromVision(this);
13148
13149 // must immediately set seer back otherwise may crash
13150 SetSeer(this);
13151
13152 //WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0);
13153 //GetSession()->SendPacket(&data);
13154 }
13155}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:704
void SetSeer(WorldObject *target)
Definition: Player.h:2359
void UpdateVisibilityOf(WorldObject *target)
Definition: PlayerUpdates.cpp:1717

References Object::AddGuidValue(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), Unit::GetVehicle(), Object::IsUnit(), LOG_DEBUG, m_seer, PLAYER_FARSIGHT, Object::RemoveGuidValue(), Unit::RemovePlayerFromVision(), SetSeer(), and UpdateVisibilityOf().

Referenced by CinematicMgr::BeginCinematic(), CinematicMgr::EndCinematic(), AuraEffect::HandleBindSight(), WorldSession::HandleFarSightOpcode(), RemoveFromWorld(), and SetClientControl().

◆ SetVirtualItemSlot()

void Player::SetVirtualItemSlot ( uint8  i,
Item item 
)
Todo:
: this import is not necessary for compilation and marked as unused by the IDE
78{
79 ASSERT(i < 3);
80 if (i < 2 && item)
81 {
83 return;
85 if (charges == 0)
86 return;
87 if (charges > 1)
89 else if (charges <= 1)
90 {
93 }
94 }
95}

References ApplyEnchantment(), ASSERT, Item::ClearEnchantment(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Item::SetEnchantmentCharges(), and TEMP_ENCHANTMENT_SLOT.

Referenced by SetSheath().

◆ SetVisibleItemSlot()

void Player::SetVisibleItemSlot ( uint8  slot,
Item pItem 
)

◆ SetWaterWalking()

bool Player::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
overridevirtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

movement counter

Reimplemented from Unit.

15905{
15906 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15907 if (!packetOnly /* && !Unit::SetWaterWalking(apply)*/)
15908 {
15909 Unit::SetWaterWalking(apply);
15910 // return false;
15911 }
15912
15914 data << GetPackGUID();
15915 data << uint32(0);
15916 SendDirectMessage(&data);
15917
15918 data.Initialize(MSG_MOVE_WATER_WALK, 64);
15919 data << GetPackGUID();
15920 BuildMovementPacket(&data);
15921 SendMessageToSet(&data, false);
15922 return true;
15923}
@ MSG_MOVE_WATER_WALK
Definition: Opcodes.h:719
virtual bool SetWaterWalking(bool enable, bool packetOnly=false)
Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for...
Definition: Unit.cpp:20397

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_WATER_WALK, SendDirectMessage(), SendMessageToSet(), Unit::SetWaterWalking(), SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), and ResurrectPlayer().

◆ setWeaponChangeTimer()

void Player::setWeaponChangeTimer ( uint32  time)
inline
1615{m_weaponChangeTimer = time;}

References m_weaponChangeTimer.

◆ SetWeeklyQuestStatus()

void Player::SetWeeklyQuestStatus ( uint32  quest_id)
12081{
12082 m_weeklyquests.insert(quest_id);
12083 m_WeeklyQuestChanged = true;
12084}

References m_WeeklyQuestChanged, and m_weeklyquests.

Referenced by RewardQuest().

◆ SpawnCorpseBones()

void Player::SpawnCorpseBones ( bool  triggerSave = true)
4696{
4698 if (GetMap()->ConvertCorpseToBones(GetGUID()))
4699 if (triggerSave && !GetSession()->PlayerLogoutWithSave()) // at logout we will already store the player
4700 {
4701 // prevent loading as ghost without corpse
4702 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4703
4704 // pussywizard: update only ghost flag instead of whole character table entry! data integrity is crucial
4706 stmt->SetData(0, GetGUID().GetCounter());
4707 trans->Append(stmt);
4708
4709 _SaveAuras(trans, false);
4710
4711 CharacterDatabase.CommitTransaction(trans);
4712 }
4713}
@ CHAR_UPD_CHAR_REMOVE_GHOST
Definition: CharacterDatabase.h:431

References _corpseLocation, _SaveAuras(), CHAR_UPD_CHAR_REMOVE_GHOST, CharacterDatabase, Object::GetGUID(), WorldObject::GetMap(), GetSession(), PreparedStatementBase::SetData(), and WorldLocation::WorldRelocate().

Referenced by Battleground::_ProcessResurrect(), CreateCorpse(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), group_commandscript::HandleGroupReviveCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ SplitItem()

void Player::SplitItem ( uint16  src,
uint16  dst,
uint32  count 
)

If trading

If current item is in trade window (only possible with packet spoofing - silent return)

3422{
3423 uint8 srcbag = src >> 8;
3424 uint8 srcslot = src & 255;
3425
3426 uint8 dstbag = dst >> 8;
3427 uint8 dstslot = dst & 255;
3428
3429 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3430 if (!pSrcItem)
3431 {
3432 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3433 return;
3434 }
3435
3436 if (pSrcItem->m_lootGenerated) // prevent split looting item (item
3437 {
3438 //best error message found for attempting to split while looting
3440 return;
3441 }
3442
3443 // not let split all items (can be only at cheating)
3444 if (pSrcItem->GetCount() == count)
3445 {
3447 return;
3448 }
3449
3450 // not let split more existed items (can be only at cheating)
3451 if (pSrcItem->GetCount() < count)
3452 {
3454 return;
3455 }
3456
3458 if (TradeData* tradeData = GetTradeData())
3459 {
3461 if (tradeData->GetTradeSlotForItem(pSrcItem->GetGUID()) != TRADE_SLOT_INVALID)
3462 return;
3463 }
3464
3465 LOG_DEBUG("entities.player.items", "STORAGE: SplitItem bag = {}, slot = {}, item = {}, count = {}", dstbag, dstslot, pSrcItem->GetEntry(), count);
3466 Item* pNewItem = pSrcItem->CloneItem(count, this);
3467 if (!pNewItem)
3468 {
3469 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3470 return;
3471 }
3472
3473 if (IsInventoryPos(dst))
3474 {
3475 // change item amount before check (for unique max count check)
3476 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3477
3478 ItemPosCountVec dest;
3479 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pNewItem, false);
3480 if (msg != EQUIP_ERR_OK)
3481 {
3482 delete pNewItem;
3483 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3484 SendEquipError(msg, pSrcItem, nullptr);
3485 return;
3486 }
3487
3488 if (IsInWorld())
3489 pSrcItem->SendUpdateToPlayer(this);
3490 pSrcItem->SetState(ITEM_CHANGED, this);
3491 StoreItem(dest, pNewItem, true);
3492 }
3493 else if (IsBankPos(dst))
3494 {
3495 // change item amount before check (for unique max count check)
3496 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3497
3498 ItemPosCountVec dest;
3499 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pNewItem, false);
3500 if (msg != EQUIP_ERR_OK)
3501 {
3502 delete pNewItem;
3503 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3504 SendEquipError(msg, pSrcItem, nullptr);
3505 return;
3506 }
3507
3508 if (IsInWorld())
3509 pSrcItem->SendUpdateToPlayer(this);
3510 pSrcItem->SetState(ITEM_CHANGED, this);
3511 BankItem(dest, pNewItem, true);
3512 }
3513 else if (IsEquipmentPos(dst))
3514 {
3515 // change item amount before check (for unique max count check), provide space for splitted items
3516 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3517
3518 uint16 dest;
3519 InventoryResult msg = CanEquipItem(dstslot, dest, pNewItem, false);
3520 if (msg != EQUIP_ERR_OK)
3521 {
3522 delete pNewItem;
3523 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3524 SendEquipError(msg, pSrcItem, nullptr);
3525 return;
3526 }
3527
3528 if (IsInWorld())
3529 pSrcItem->SendUpdateToPlayer(this);
3530 pSrcItem->SetState(ITEM_CHANGED, this);
3531 EquipItem(dest, pNewItem, true);
3533 }
3534}
@ TRADE_SLOT_INVALID
Definition: TradeData.h:32
@ EQUIP_ERR_COULDNT_SPLIT_ITEMS
Definition: Item.h:74
@ EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT
Definition: Item.h:73
TradeData * GetTradeData() const
Definition: Player.h:1388
Definition: TradeData.h:36

References AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), Item::CloneItem(), EQUIP_ERR_COULDNT_SPLIT_ITEMS, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, EquipItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetTradeData(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), ITEM_CHANGED, LOG_DEBUG, Item::m_lootGenerated, SendEquipError(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), and TRADE_SLOT_INVALID.

Referenced by WorldSession::HandleSplitItemOpcode().

◆ StartTimedAchievement()

void Player::StartTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry,
uint32  timeLost = 0 
)
13867{
13868 m_achievementMgr->StartTimedAchievement(type, entry, timeLost);
13869}
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition: AchievementMgr.cpp:2222

References m_achievementMgr, and AchievementMgr::StartTimedAchievement().

Referenced by Spell::_cast(), AddQuest(), Spell::DoSpellHitOnUnit(), InstanceScript::DoStartTimedAchievement(), BattlegroundWS::EventPlayerClickedOnFlag(), and KilledMonsterCredit().

◆ StopCastingBindSight()

void Player::StopCastingBindSight ( Aura except = nullptr)
13102{
13103 if (WorldObject* target = GetViewpoint())
13104 {
13105 if (target->IsUnit())
13106 {
13107 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except);
13108 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except);
13109 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID(), except);
13110 }
13111 }
13112}
@ SPELL_AURA_MOD_POSSESS_PET
Definition: SpellAuraDefines.h:191
@ SPELL_AURA_MOD_POSSESS
Definition: SpellAuraDefines.h:65
@ SPELL_AURA_BIND_SIGHT
Definition: SpellAuraDefines.h:64

References Object::GetGUID(), GetViewpoint(), SPELL_AURA_BIND_SIGHT, SPELL_AURA_MOD_POSSESS, and SPELL_AURA_MOD_POSSESS_PET.

Referenced by ActivateTaxiPathTo(), misc_commandscript::HandleUnbindSightCommand(), RemoveFromWorld(), and Unit::SetCharmedBy().

◆ StopCastingCharm()

void Player::StopCastingCharm ( Aura except = nullptr)
9307{
9308 Unit* charm = GetCharm();
9309 if (!charm)
9310 {
9311 return;
9312 }
9313
9314 if (charm->IsCreature())
9315 {
9317 {
9318 ((Puppet*)charm)->UnSummon();
9319 }
9320 else if (charm->IsVehicle())
9321 {
9322 ExitVehicle();
9323 }
9324 }
9325
9326 if (GetCharmGUID())
9327 {
9332 }
9333
9334 if (GetCharmGUID())
9335 {
9336 LOG_FATAL("entities.player", "Player {} ({} is not able to uncharm unit ({})", GetName(), GetGUID().ToString(), GetCharmGUID().ToString());
9337
9338 if (charm->GetCharmerGUID())
9339 {
9340 LOG_FATAL("entities.player", "Charmed unit has charmer {}", charm->GetCharmerGUID().ToString());
9341 ABORT();
9342 }
9343 else
9344 {
9345 SetCharm(charm, false);
9346 }
9347 }
9348}
@ UNIT_MASK_PUPPET
Definition: UnitDefines.h:162
@ SPELL_AURA_MOD_CHARM
Definition: SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240
#define ABORT
Definition: Errors.h:76
Definition: TemporarySummon.h:115
bool IsVehicle() const
Definition: Unit.h:750
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10920
ObjectGuid GetCharmGUID() const
Definition: Unit.h:676

References ABORT, ObjectGuid::Empty, Unit::ExitVehicle(), Unit::GetCharm(), Unit::GetCharmerGUID(), Unit::GetCharmGUID(), Object::GetGUID(), WorldObject::GetName(), Unit::HasUnitTypeMask(), Object::IsCreature(), Unit::IsVehicle(), LOG_FATAL, Unit::RemoveAurasByType(), Unit::SetCharm(), SPELL_AURA_AOE_CHARM, SPELL_AURA_MOD_CHARM, SPELL_AURA_MOD_POSSESS, SPELL_AURA_MOD_POSSESS_PET, Object::ToCreature(), ObjectGuid::ToString(), Position::ToString(), and UNIT_MASK_PUPPET.

Referenced by ActivateTaxiPathTo(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), Unit::RemoveAllControlled(), RemoveFromWorld(), Unit::SetCharmedBy(), and npc_chesspiece::sGossipSelect().

◆ StopMirrorTimer()

void Player::StopMirrorTimer ( MirrorTimerType  Type)
protected

◆ StopMirrorTimers()

◆ StoreItem()

Item * Player::StoreItem ( ItemPosCountVec const &  pos,
Item pItem,
bool  update 
)
2575{
2576 if (!pItem)
2577 return nullptr;
2578
2579 Item* lastItem = pItem;
2580 ItemTemplate const* proto = pItem->GetTemplate();
2581
2582 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end();)
2583 {
2584 uint16 pos = itr->pos;
2585 uint32 count = itr->count;
2586
2587 ++itr;
2588
2589 if (itr == dest.end())
2590 {
2591 lastItem = _StoreItem(pos, pItem, count, false, update);
2592 break;
2593 }
2594
2595 lastItem = _StoreItem(pos, pItem, count, true, update);
2596 }
2597
2598 // cast after item storing - some checks in checkcast requires item to be present!!
2599 if (lastItem)
2600 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
2601 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
2602 if (!HasAura(proto->Spells[i].SpellId))
2603 CastSpell(this, proto->Spells[i].SpellId, true, lastItem);
2604
2605 return lastItem;
2606}
Item * _StoreItem(uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
Definition: PlayerStorage.cpp:2609

References _StoreItem(), Unit::CastSpell(), Item::GetTemplate(), Unit::HasAura(), ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, MAX_ITEM_PROTO_SPELLS, _Spell::SpellId, ItemTemplate::Spells, and _Spell::SpellTrigger.

Referenced by _LoadInventory(), AutoUnequipOffhandIfNeed(), BankItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleMailCreateTextItem(), MoveItemToInventory(), SplitItem(), StoreNewItem(), and SwapItem().

◆ StoreLootItem()

LootItem * Player::StoreLootItem ( uint8  lootSlot,
Loot loot,
InventoryResult msg 
)
13462{
13463 QuestItem* qitem = nullptr;
13464 QuestItem* ffaitem = nullptr;
13465 QuestItem* conditem = nullptr;
13466
13467 msg = EQUIP_ERR_OK;
13468
13469 LootItem* item = loot->LootItemInSlot(lootSlot, this, &qitem, &ffaitem, &conditem);
13470 if (!item || item->is_looted)
13471 {
13472 if (!sScriptMgr->OnPlayerCanSendErrorAlreadyLooted(this))
13473 {
13474 SendEquipError(EQUIP_ERR_ALREADY_LOOTED, nullptr, nullptr);
13475 }
13476 return nullptr;
13477 }
13478
13479 // Xinef: exploit protection, dont allow to loot normal items if player is not master loot and not below loot threshold
13480 // Xinef: only quest, ffa and conditioned items
13481 if (!item->is_underthreshold && loot->roundRobinPlayer && !GetLootGUID().IsItem() && GetGroup() && GetGroup()->GetLootMethod() == MASTER_LOOT && GetGUID() != GetGroup()->GetMasterLooterGuid())
13482 if (!qitem && !ffaitem && !conditem)
13483 {
13485 return nullptr;
13486 }
13487
13488 if (!item->AllowedForPlayer(this, loot->sourceWorldObjectGUID))
13489 {
13491 return nullptr;
13492 }
13493
13494 // questitems use the blocked field for other purposes
13495 if (!qitem && item->is_blocked)
13496 {
13498 return nullptr;
13499 }
13500
13501 // xinef: dont allow protected item to be looted by someone else
13502 if (item->rollWinnerGUID && item->rollWinnerGUID != GetGUID())
13503 {
13505 return nullptr;
13506 }
13507
13508 ItemPosCountVec dest;
13509 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count);
13510 if (msg == EQUIP_ERR_OK)
13511 {
13512 AllowedLooterSet looters = item->GetAllowedLooters();
13513 Item* newitem = StoreNewItem(dest, item->itemid, true, item->randomPropertyId, looters);
13514
13515 if (qitem)
13516 {
13517 qitem->is_looted = true;
13518 //freeforall is 1 if everyone's supposed to get the quest item.
13519 if (item->freeforall || loot->GetPlayerQuestItems().size() == 1)
13520 SendNotifyLootItemRemoved(lootSlot);
13521 else
13522 loot->NotifyQuestItemRemoved(qitem->index);
13523 }
13524 else
13525 {
13526 if (ffaitem)
13527 {
13528 //freeforall case, notify only one player of the removal
13529 ffaitem->is_looted = true;
13530 SendNotifyLootItemRemoved(lootSlot);
13531 }
13532 else
13533 {
13534 //not freeforall, notify everyone
13535 if (conditem)
13536 conditem->is_looted = true;
13537 loot->NotifyItemRemoved(lootSlot);
13538 }
13539 }
13540
13541 //if only one person is supposed to loot the item, then set it to looted
13542 if (!item->freeforall)
13543 item->is_looted = true;
13544
13545 --loot->unlootedCount;
13546
13547 SendNewItem(newitem, uint32(item->count), false, false, true);
13548 UpdateLootAchievements(item, loot);
13549
13550 // LootItem is being removed (looted) from the container, delete it from the DB.
13551 if (loot->containerGUID)
13552 sLootItemStorage->RemoveStoredLootItem(loot->containerGUID, item->itemid, item->count, loot, item->itemIndex);
13553
13554 sScriptMgr->OnPlayerLootItem(this, newitem, item->count, this->GetLootGUID());
13555 }
13556 else
13557 {
13558 SendEquipError(msg, nullptr, nullptr, item->itemid);
13559 }
13560
13561 return item;
13562}
bool IsItem() const
Definition: Object.h:225
void UpdateLootAchievements(LootItem *item, Loot *loot)
Definition: PlayerUpdates.cpp:2167
void SendNotifyLootItemRemoved(uint8 lootSlot)
Definition: Player.cpp:8179
bool is_blocked
Definition: LootMgr.h:164
ObjectGuid rollWinnerGUID
Definition: LootMgr.h:161
bool is_underthreshold
Definition: LootMgr.h:166
bool AllowedForPlayer(Player const *player, ObjectGuid source) const
Definition: LootMgr.cpp:416
uint32 itemIndex
Definition: LootMgr.h:156
bool is_looted
Definition: LootMgr.h:163
const AllowedLooterSet & GetAllowedLooters() const
Definition: LootMgr.h:181
bool freeforall
Definition: LootMgr.h:165
Definition: LootMgr.h:185
uint8 index
Definition: LootMgr.h:186
bool is_looted
Definition: LootMgr.h:187
ObjectGuid sourceWorldObjectGUID
Definition: LootMgr.h:330
void NotifyQuestItemRemoved(uint8 questIndex)
Definition: LootMgr.cpp:803
QuestItemMap const & GetPlayerQuestItems() const
Definition: LootMgr.h:316
void NotifyItemRemoved(uint8 lootIndex)
Definition: LootMgr.cpp:772

References LootItem::AllowedForPlayer(), CanStoreNewItem(), Loot::containerGUID, LootItem::count, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_OK, LootItem::freeforall, LootItem::GetAllowedLooters(), GetGroup(), Object::GetGUID(), GetLootGUID(), Loot::GetPlayerQuestItems(), QuestItem::index, LootItem::is_blocked, LootItem::is_looted, QuestItem::is_looted, LootItem::is_underthreshold, Object::IsItem(), LootItem::itemid, LootItem::itemIndex, Loot::LootItemInSlot(), MASTER_LOOT, Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, LootItem::rollWinnerGUID, Loot::roundRobinPlayer, SendEquipError(), SendLootRelease(), SendNewItem(), SendNotifyLootItemRemoved(), sLootItemStorage, Loot::sourceWorldObjectGUID, sScriptMgr, StoreNewItem(), Loot::unlootedCount, and UpdateLootAchievements().

Referenced by Loot::FillNotNormalLootFor(), and WorldSession::HandleAutostoreLootItemOpcode().

◆ StoreNewItem() [1/2]

Item * Player::StoreNewItem ( ItemPosCountVec const &  pos,
uint32  item,
bool  update,
int32  randomPropertyId,
AllowedLooterSet allowedLooters 
)
2532{
2533 uint32 count = 0;
2534 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
2535 count += itr->count;
2536
2537 Item* pItem = Item::CreateItem(item, count, this, false, randomPropertyId);
2538 if (pItem)
2539 {
2540 // pussywizard: obtaining blue or better items saves to db
2541 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2542 if (pProto->Quality >= ITEM_QUALITY_RARE)
2544
2545 ItemAddedQuestCheck(item, count);
2548 pItem = StoreItem(dest, pItem, update);
2549
2550 if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound() && sWorld->getBoolConfig(CONFIG_SET_BOP_ITEM_TRADEABLE))
2551 {
2552 pItem->SetSoulboundTradeable(allowedLooters);
2554 AddTradeableItem(pItem);
2555
2556 // save data
2557 std::ostringstream ss;
2558 AllowedLooterSet::const_iterator itr = allowedLooters.begin();
2559 ss << (*itr).GetCounter();
2560 for (++itr; itr != allowedLooters.end(); ++itr)
2561 ss << ' ' << (*itr).GetCounter();
2562
2564 stmt->SetData(0, pItem->GetGUID().GetCounter());
2565 stmt->SetData(1, ss.str());
2566 CharacterDatabase.Execute(stmt);
2567 }
2568
2569 sScriptMgr->OnPlayerStoreNewItem(this, pItem, count);
2570 }
2571 return pItem;
2572}
@ ITEM_FIELD_CREATE_PLAYED_TIME
Definition: UpdateFields.h:71
@ CONFIG_SET_BOP_ITEM_TRADEABLE
Definition: IWorld.h:165
@ CHAR_INS_ITEM_BOP_TRADE
Definition: CharacterDatabase.h:122
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM
Definition: DBCEnums.h:150

References ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), AddTradeableItem(), CHAR_INS_ITEM_BOP_TRADE, CharacterDatabase, CONFIG_SET_BOP_ITEM_TRADEABLE, Item::CreateItem(), ObjectGuid::GetCounter(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), GetTotalPlayedTime(), Item::IsSoulBound(), ITEM_FIELD_CREATE_PLAYED_TIME, ITEM_QUALITY_RARE, ItemAddedQuestCheck(), PreparedStatementBase::SetData(), Item::SetSoulboundTradeable(), Object::SetUInt32Value(), sObjectMgr, sScriptMgr, StoreItem(), sWorld, and UpdateAchievementCriteria().

◆ StoreNewItem() [2/2]

◆ StoreNewItemInBestSlots()

bool Player::StoreNewItemInBestSlots ( uint32  item_id,
uint32  item_count 
)
703{
704 LOG_DEBUG("entities.player.items", "STORAGE: Creating initial item, itemId = {}, count = {}", titem_id, titem_amount);
705
706 // attempt equip by one
707 while (titem_amount > 0)
708 {
709 uint16 eDest;
710 InventoryResult msg = CanEquipNewItem(NULL_SLOT, eDest, titem_id, false);
711 if (msg != EQUIP_ERR_OK)
712 break;
713
714 EquipNewItem(eDest, titem_id, true);
716 --titem_amount;
717 }
718
719 if (titem_amount == 0)
720 return true; // equipped
721
722 // attempt store
723 ItemPosCountVec sDest;
724 // store in main bag to simplify second pass (special bags can be not equipped yet at this moment)
725 InventoryResult msg = CanStoreNewItem(INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount);
726 if (msg == EQUIP_ERR_OK)
727 {
728 StoreNewItem(sDest, titem_id, true);
729 return true; // stored
730 }
731
732 // item can't be added
733 LOG_ERROR("entities.player", "STORAGE: Can't equip or store initial item {} for race {} class {}, error msg = {}", titem_id, getRace(true), getClass(), msg);
734 return false;
735}

References AutoUnequipOffhandIfNeed(), CanEquipNewItem(), CanStoreNewItem(), EQUIP_ERR_OK, EquipNewItem(), Unit::getClass(), Unit::getRace(), INVENTORY_SLOT_BAG_0, LOG_DEBUG, LOG_ERROR, NULL_SLOT, and StoreNewItem().

Referenced by Create().

◆ StoreRaidMapDifficulty()

void Player::StoreRaidMapDifficulty ( )
inline

◆ SummonIfPossible()

void Player::SummonIfPossible ( bool  agree,
ObjectGuid  summoner_guid 
)
12367{
12368 if (!agree)
12369 {
12370 m_summon_expire = 0;
12371 return;
12372 }
12373
12374 // expire and auto declined
12375 if (m_summon_expire < GameTime::GetGameTime().count())
12376 return;
12377
12378 // drop flag at summon
12379 // this code can be reached only when GM is summoning player who carries flag, because player should be immune to summoning spells when he carries flag
12380 if (Battleground* bg = GetBattleground())
12381 bg->EventPlayerDroppedFlag(this);
12382
12383 m_summon_expire = 0;
12384
12386
12388}
@ ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS
Definition: DBCEnums.h:220
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:245

References ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, ObjectAccessor::FindPlayer(), GetBattleground(), GameTime::GetGameTime(), Position::GetOrientation(), m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, TeleportTo(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleSummonResponseOpcode().

◆ SummonPet()

Pet * Player::SummonPet ( uint32  entry,
float  x,
float  y,
float  z,
float  ang,
PetType  petType,
Milliseconds  duration = 0s,
uint32  healthPct = 0 
)
8943{
8944 PetStable& petStable = GetOrInitPetStable();
8945
8946 Pet* pet = new Pet(this, petType);
8947
8948 if (petType == SUMMON_PET && pet->LoadPetFromDB(this, entry, 0, false, healthPct))
8949 {
8950 // Remove Demonic Sacrifice auras (known pet)
8952 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
8953 {
8954 if ((*itr)->GetMiscValue() == 2228)
8955 {
8956 RemoveAurasDueToSpell((*itr)->GetId());
8957 itr = auraClassScripts.begin();
8958 }
8959 else
8960 ++itr;
8961 }
8962
8963 if (duration > 0s)
8964 pet->SetDuration(duration);
8965
8966 // Generate a new name for the newly summoned ghoul
8967 if (pet->IsPetGhoul())
8968 {
8969 std::string new_name = sObjectMgr->GeneratePetNameLocale(entry, GetSession()->GetSessionDbLocaleIndex());
8970 if (!new_name.empty())
8971 pet->SetName(new_name);
8972 }
8973
8974 return nullptr;
8975 }
8976
8977 // petentry == 0 for hunter "call pet" (current pet summoned if any)
8978 if (!entry)
8979 {
8980 delete pet;
8981 return nullptr;
8982 }
8983
8984 pet->Relocate(x, y, z, ang);
8985 if (!pet->IsPositionValid())
8986 {
8987 LOG_ERROR("misc", "Player::SummonPet: Pet ({}, Entry: {}) not summoned. Suggested coordinates aren't valid (X: {} Y: {})", pet->GetGUID().ToString(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY());
8988 delete pet;
8989 return nullptr;
8990 }
8991
8992 Map* map = GetMap();
8993 uint32 pet_number = sObjectMgr->GeneratePetNumber();
8994 if (!pet->Create(map->GenerateLowGuid<HighGuid::Pet>(), map, GetPhaseMask(), entry, pet_number))
8995 {
8996 LOG_ERROR("misc", "Player::SummonPet: No such creature entry {}", entry);
8997 delete pet;
8998 return nullptr;
8999 }
9000
9001 if (petType == SUMMON_PET && petStable.CurrentPet)
9003
9004 pet->SetCreatorGUID(GetGUID());
9005 pet->SetFaction(GetFaction());
9010
9011 SetMinion(pet, true);
9012
9013 if (petType == SUMMON_PET)
9014 {
9016 {
9017 pet->GetCharmInfo()->SetPetNumber(pet_number, true); // Show pet details tab (Shift+P) only for demons & undead
9018 }
9019 else
9020 {
9021 pet->GetCharmInfo()->SetPetNumber(pet_number, false);
9022 }
9023
9026 pet->SetFullHealth();
9028 pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped in this case
9029 }
9030
9031 map->AddToMap(pet->ToCreature(), true);
9032
9033 ASSERT(!petStable.CurrentPet && (petType != HUNTER_PET || !petStable.GetUnslottedHunterPet()));
9034 pet->FillPetInfo(&petStable.CurrentPet.emplace());
9035
9036 if (petType == SUMMON_PET)
9037 {
9038 pet->InitPetCreateSpells();
9039 pet->InitTalentForLevel();
9042
9043 // Remove Demonic Sacrifice auras (known pet)
9045 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
9046 {
9047 if ((*itr)->GetMiscValue() == 2228)
9048 {
9049 RemoveAurasDueToSpell((*itr)->GetId());
9050 itr = auraClassScripts.begin();
9051 }
9052 else
9053 ++itr;
9054 }
9055 }
9056
9057 if (duration > 0s)
9058 pet->SetDuration(duration);
9059
9061 {
9064 }
9065
9066 return pet;
9067}
@ SUMMON_PET
Definition: PetDefines.h:31
@ UNIT_FIELD_PETEXPERIENCE
Definition: UpdateFields.h:134
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition: UpdateFields.h:133
@ UNIT_FIELD_PETNEXTLEVELEXP
Definition: UpdateFields.h:135
@ UNIT_NPC_FLAG_NONE
Definition: UnitDefines.h:314
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175
@ CREATURE_TYPE_UNDEAD
Definition: SharedDefines.h:2633
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2630
uint32 type
Definition: CreatureData.h:222
bool IsPetGhoul() const
Definition: TemporarySummon.h:85
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1018
void SetName(std::string const &newname)
Definition: Object.h:465
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2471
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 pet_number)
Definition: Pet.cpp:2315
void SetDuration(Milliseconds dur)
Definition: Pet.h:90
void InitPetCreateSpells()
Definition: Pet.cpp:2046
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15524
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: CharmInfo.cpp:240
float GetHealthPct() const
Definition: Unit.h:1031
void ReplaceAllNpcFlags(NPCFlags flags)
Definition: Unit.h:721
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:487

References Map::AddToMap(), ASSERT, Pet::Create(), CREATURE_TYPE_DEMON, CREATURE_TYPE_UNDEAD, PetStable::CurrentPet, CreatureTemplate::family, Pet::FillPetInfo(), WorldObject::FindMap(), Map::GenerateLowGuid(), Unit::GetAuraEffectsByType(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), Unit::GetFaction(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetHealthPct(), Unit::GetLevel(), WorldObject::GetMap(), Unit::GetMaxPower(), GetOrInitPetStable(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), GetSession(), PetStable::GetUnslottedHunterPet(), HUNTER_PET, Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Pet::InitTalentForLevel(), Minion::IsPetGhoul(), Position::IsPositionValid(), Pet::LoadPetFromDB(), LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_AS_CURRENT, PET_SAVE_NOT_IN_SLOT, PetSpellInitialize(), POWER_MANA, Position::Relocate(), Unit::RemoveAurasDueToSpell(), RemovePet(), Unit::ReplaceAllNpcFlags(), Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), Unit::SetCreatorGUID(), Pet::SetDuration(), Unit::SetFaction(), Unit::SetFullHealth(), Unit::SetMinion(), WorldObject::SetName(), CharmInfo::SetPetNumber(), Unit::SetPower(), Unit::setPowerType(), Unit::SetUInt32Value(), sObjectMgr, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SUMMON_PET, Object::ToCreature(), ObjectGuid::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_1, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FIELD_PETEXPERIENCE, UNIT_FIELD_PETNEXTLEVELEXP, and UNIT_NPC_FLAG_NONE.

Referenced by Spell::EffectResurrectPet(), and Spell::EffectSummonPet().

◆ SwapItem()

void Player::SwapItem ( uint16  src,
uint16  dst 
)
3537{
3538 uint8 srcbag = src >> 8;
3539 uint8 srcslot = src & 255;
3540
3541 uint8 dstbag = dst >> 8;
3542 uint8 dstslot = dst & 255;
3543
3544 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3545 Item* pDstItem = GetItemByPos(dstbag, dstslot);
3546
3547 if (!pSrcItem)
3548 return;
3549
3550 LOG_DEBUG("entities.player.items", "STORAGE: SwapItem bag = {}, slot = {}, item = {}", dstbag, dstslot, pSrcItem->GetEntry());
3551
3552 if (!IsAlive())
3553 {
3554 SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem);
3555 return;
3556 }
3557
3558 // SRC checks
3559
3560 if (GetLootGUID() == pSrcItem->GetGUID()) // prevent swap looting item
3561 {
3562 //best error message found for attempting to swap while looting
3563 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pSrcItem, nullptr);
3564 return;
3565 }
3566
3567 // check unequip potability for equipped items and bank bags
3568 if (IsEquipmentPos(src) || IsBagPos(src))
3569 {
3570 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3571 InventoryResult msg = CanUnequipItem(src, !IsBagPos(src) || IsBagPos(dst) || (pDstItem && pDstItem->ToBag() && pDstItem->ToBag()->IsEmpty()));
3572 if (msg != EQUIP_ERR_OK)
3573 {
3574 SendEquipError(msg, pSrcItem, pDstItem);
3575 return;
3576 }
3577 }
3578
3579 // anti-wpe
3580 if (pSrcItem->IsBag() && pSrcItem->IsNotEmptyBag() && !IsBagPos(dst))
3581 {
3583 return;
3584 }
3585
3586 // prevent put equipped/bank bag in self
3587 if (IsBagPos(src) && srcslot == dstbag)
3588 {
3590 return;
3591 }
3592
3593 // prevent equipping bag in the same slot from its inside
3594 if (IsBagPos(dst) && srcbag == dstslot)
3595 {
3597 return;
3598 }
3599
3600 // DST checks
3601
3602 if (pDstItem)
3603 {
3604 // Xinef: Removed next loot generated check
3605 if (pDstItem->GetGUID() == GetLootGUID()) // prevent swap looting item
3606 {
3607 //best error message found for attempting to swap while looting
3608 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, nullptr);
3609 return;
3610 }
3611
3612 // check unequip potability for equipped items and bank bags
3613 if (IsEquipmentPos(dst) || IsBagPos(dst))
3614 {
3615 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3616 InventoryResult msg = CanUnequipItem(dst, !IsBagPos(dst) || IsBagPos(src) || (pSrcItem->ToBag() && pSrcItem->ToBag()->IsEmpty()));
3617 if (msg != EQUIP_ERR_OK)
3618 {
3619 SendEquipError(msg, pSrcItem, pDstItem);
3620 return;
3621 }
3622 }
3623 }
3624
3625 // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions)
3626 // or swap empty bag with another empty or not empty bag (with items exchange)
3627
3628 // Move case
3629 if (!pDstItem)
3630 {
3631 if (IsInventoryPos(dst))
3632 {
3633 ItemPosCountVec dest;
3634 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pSrcItem, false);
3635 if (msg != EQUIP_ERR_OK)
3636 {
3637 SendEquipError(msg, pSrcItem, nullptr);
3638 return;
3639 }
3640
3641 RemoveItem(srcbag, srcslot, true);
3642 StoreItem(dest, pSrcItem, true);
3644 if (IsBankPos(src))
3645 ItemAddedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3646 }
3647 else if (IsBankPos(dst))
3648 {
3649 ItemPosCountVec dest;
3650 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pSrcItem, false);
3651 if (msg != EQUIP_ERR_OK)
3652 {
3653 SendEquipError(msg, pSrcItem, nullptr);
3654 return;
3655 }
3656
3657 RemoveItem(srcbag, srcslot, true);
3658 BankItem(dest, pSrcItem, true);
3660 ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3661 }
3662 else if (IsEquipmentPos(dst))
3663 {
3664 uint16 dest;
3665 InventoryResult msg = CanEquipItem(dstslot, dest, pSrcItem, false);
3666 if (msg != EQUIP_ERR_OK)
3667 {
3668 SendEquipError(msg, pSrcItem, nullptr);
3669 return;
3670 }
3671
3672 RemoveItem(srcbag, srcslot, true);
3673 EquipItem(dest, pSrcItem, true);
3675 }
3676
3677 return;
3678 }
3679
3680 // attempt merge to / fill target item
3681 if (!pSrcItem->IsBag() && !pDstItem->IsBag())
3682 {
3683 InventoryResult msg;
3684 ItemPosCountVec sDest;
3685 uint16 eDest = 0;
3686 if (IsInventoryPos(dst))
3687 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, false);
3688 else if (IsBankPos(dst))
3689 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, false);
3690 else if (IsEquipmentPos(dst))
3691 msg = CanEquipItem(dstslot, eDest, pSrcItem, false);
3692 else
3693 return;
3694
3695 // can be merge/fill
3696 if (msg == EQUIP_ERR_OK)
3697 {
3698 if (pSrcItem->GetCount() + pDstItem->GetCount() <= pSrcItem->GetTemplate()->GetMaxStackSize())
3699 {
3700 RemoveItem(srcbag, srcslot, true);
3701
3702 if (IsInventoryPos(dst))
3703 StoreItem(sDest, pSrcItem, true);
3704 else if (IsBankPos(dst))
3705 BankItem(sDest, pSrcItem, true);
3706 else if (IsEquipmentPos(dst))
3707 {
3708 EquipItem(eDest, pSrcItem, true);
3710 }
3711 }
3712 else
3713 {
3714 pSrcItem->SetCount(pSrcItem->GetCount() + pDstItem->GetCount() - pSrcItem->GetTemplate()->GetMaxStackSize());
3715 pDstItem->SetCount(pSrcItem->GetTemplate()->GetMaxStackSize());
3716 pSrcItem->SetState(ITEM_CHANGED, this);
3717 pDstItem->SetState(ITEM_CHANGED, this);
3718 if (IsInWorld())
3719 {
3720 pSrcItem->SendUpdateToPlayer(this);
3721 pDstItem->SendUpdateToPlayer(this);
3722 }
3723 }
3724 SendRefundInfo(pDstItem);
3725 return;
3726 }
3727 }
3728
3729 // Remove item enchantments for now and restore it later
3730 // Needed for swap sanity checks
3731 ApplyEnchantment(pSrcItem, false);
3732 if (pDstItem)
3733 {
3734 ApplyEnchantment(pDstItem, false);
3735 }
3736
3737 // impossible merge/fill, do real swap
3739
3740 // check src->dest move possibility
3741 ItemPosCountVec sDest;
3742 uint16 eDest = 0;
3743 if (IsInventoryPos(dst))
3744 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, true);
3745 else if (IsBankPos(dst))
3746 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, true);
3747 else if (IsEquipmentPos(dst))
3748 {
3749 msg = CanEquipItem(dstslot, eDest, pSrcItem, true);
3750 if (msg == EQUIP_ERR_OK)
3751 msg = CanUnequipItem(eDest, true);
3752 }
3753
3754 if (msg != EQUIP_ERR_OK)
3755 {
3756 // Restore enchantments
3757 ApplyEnchantment(pSrcItem, true);
3758 if (pDstItem)
3759 {
3760 ApplyEnchantment(pDstItem, true);
3761 }
3762
3763 SendEquipError(msg, pSrcItem, pDstItem);
3764 return;
3765 }
3766
3767 // check dest->src move possibility
3768 ItemPosCountVec sDest2;
3769 uint16 eDest2 = 0;
3770 if (IsInventoryPos(src))
3771 msg = CanStoreItem(srcbag, srcslot, sDest2, pDstItem, true);
3772 else if (IsBankPos(src))
3773 msg = CanBankItem(srcbag, srcslot, sDest2, pDstItem, true);
3774 else if (IsEquipmentPos(src))
3775 {
3776 msg = CanEquipItem(srcslot, eDest2, pDstItem, true);
3777 if (msg == EQUIP_ERR_OK)
3778 msg = CanUnequipItem(eDest2, true);
3779 }
3780
3781 if (msg != EQUIP_ERR_OK)
3782 {
3783 // Restore enchantments
3784 ApplyEnchantment(pSrcItem, true);
3785 if (pDstItem)
3786 {
3787 ApplyEnchantment(pDstItem, true);
3788 }
3789
3790 SendEquipError(msg, pDstItem, pSrcItem);
3791 return;
3792 }
3793
3794 // Restore enchantments
3795 ApplyEnchantment(pSrcItem, true);
3796 if (pDstItem)
3797 {
3798 ApplyEnchantment(pDstItem, true);
3799 }
3800
3801 // Check bag swap with item exchange (one from empty in not bag possition (equipped (not possible in fact) or store)
3802 if (Bag* srcBag = pSrcItem->ToBag())
3803 {
3804 if (Bag* dstBag = pDstItem->ToBag())
3805 {
3806 Bag* emptyBag = nullptr;
3807 Bag* fullBag = nullptr;
3808 if (srcBag->IsEmpty() && !IsBagPos(src))
3809 {
3810 emptyBag = srcBag;
3811 fullBag = dstBag;
3812 }
3813 else if (dstBag->IsEmpty() && !IsBagPos(dst))
3814 {
3815 emptyBag = dstBag;
3816 fullBag = srcBag;
3817 }
3818
3819 // bag swap (with items exchange) case
3820 if (emptyBag && fullBag)
3821 {
3822 ItemTemplate const* emptyProto = emptyBag->GetTemplate();
3823
3824 uint32 count = 0;
3825
3826 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3827 {
3828 Item* bagItem = fullBag->GetItemByPos(i);
3829 if (!bagItem)
3830 continue;
3831
3832 ItemTemplate const* bagItemProto = bagItem->GetTemplate();
3833 if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto))
3834 {
3835 // one from items not go to empty target bag
3837 return;
3838 }
3839
3840 ++count;
3841 }
3842
3843 if (count > emptyBag->GetBagSize())
3844 {
3845 // too small targeted bag
3847 return;
3848 }
3849
3850 // Items swap
3851 count = 0; // will pos in new bag
3852 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3853 {
3854 Item* bagItem = fullBag->GetItemByPos(i);
3855 if (!bagItem)
3856 continue;
3857
3858 fullBag->RemoveItem(i, true);
3859 emptyBag->StoreItem(count, bagItem, true);
3860 bagItem->SetState(ITEM_CHANGED, this);
3861
3862 ++count;
3863 }
3864 }
3865 }
3866 }
3867
3868 // now do moves, remove...
3869 RemoveItem(dstbag, dstslot, false, true);
3870 RemoveItem(srcbag, srcslot, false, true);
3871
3872 // add to dest
3873 if (IsInventoryPos(dst))
3874 StoreItem(sDest, pSrcItem, true);
3875 else if (IsBankPos(dst))
3876 BankItem(sDest, pSrcItem, true);
3877 else if (IsEquipmentPos(dst))
3878 EquipItem(eDest, pSrcItem, true);
3879
3880 // add to src
3881 if (IsInventoryPos(src))
3882 StoreItem(sDest2, pDstItem, true);
3883 else if (IsBankPos(src))
3884 BankItem(sDest2, pDstItem, true);
3885 else if (IsEquipmentPos(src))
3886 EquipItem(eDest2, pDstItem, true);
3887
3888 // Xinef: Call this here after all needed items are equipped
3890
3891 // if player is moving bags and is looting an item inside this bag
3892 // release the loot
3893 if (GetLootGUID())
3894 {
3895 bool released = false;
3896 if (IsBagPos(src))
3897 {
3898 Bag* bag = pSrcItem->ToBag();
3899 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3900 {
3901 if (Item* bagItem = bag->GetItemByPos(i))
3902 {
3903 // Xinef: Removed next loot generated check
3904 if (bagItem->GetGUID() == GetLootGUID())
3905 {
3907 released = true; // so we don't need to look at dstBag
3908 break;
3909 }
3910 }
3911 }
3912 }
3913
3914 if (!released && IsBagPos(dst))
3915 {
3916 Bag* bag = pDstItem->ToBag();
3917 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3918 {
3919 if (Item* bagItem = bag->GetItemByPos(i))
3920 {
3921 // Xinef: Removed next loot generated check
3922 if (bagItem->GetGUID() == GetLootGUID())
3923 {
3925 released = true; // not realy needed here
3926 break;
3927 }
3928 }
3929 }
3930 }
3931 }
3932
3934}
bool IsEmpty() const
Definition: Bag.cpp:179
Item * GetItemByPos(uint8 slot) const
Definition: Bag.cpp:235
void RemoveItem(uint8 slot, bool update)
Definition: Bag.cpp:143
void SendRefundInfo(Item *item)
Definition: Player.cpp:15461

References ApplyEnchantment(), AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CanUnequipItem(), WorldSession::DoLootRelease(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, EquipItem(), Bag::GetBagSize(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Bag::GetItemByPos(), GetLootGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), Unit::IsAlive(), Item::IsBag(), IsBagPos(), IsBankPos(), Bag::IsEmpty(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), Item::IsNotEmptyBag(), ITEM_CHANGED, ItemAddedQuestCheck(), ItemCanGoIntoBag(), ItemRemovedQuestCheck(), LOG_DEBUG, m_session, RemoveItem(), Bag::RemoveItem(), RemoveItemDependentAurasAndCasts(), SendEquipError(), SendRefundInfo(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), Bag::StoreItem(), Item::ToBag(), and UpdateTitansGrip().

Referenced by WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleEquipmentSetUse(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSwapInvItemOpcode(), and WorldSession::HandleSwapItem().

◆ SwapQuestSlot()

void Player::SwapQuestSlot ( uint16  slot1,
uint16  slot2 
)
inline
1518 {
1519 for (int i = 0; i < MAX_QUEST_OFFSET; ++i)
1520 {
1523
1526 }
1527 }

References Object::GetUInt32Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and Unit::SetUInt32Value().

Referenced by WorldSession::HandleQuestLogSwapQuest().

◆ TakeQuestSourceItem()

bool Player::TakeQuestSourceItem ( uint32  questId,
bool  msg 
)
1364{
1365 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1366 if (quest)
1367 {
1368 uint32 srcItemId = quest->GetSrcItemId();
1369 ItemTemplate const* item = sObjectMgr->GetItemTemplate(srcItemId);
1370
1371 if (srcItemId > 0)
1372 {
1373 uint32 count = quest->GetSrcItemCount();
1374 if (count <= 0)
1375 count = 1;
1376
1377 // exist two cases when destroy source quest item not possible:
1378 // a) non un-equippable item (equipped non-empty bag, for example)
1379 // b) when quest is started from an item and item also is needed in
1380 // the end as RequiredItemId
1381 InventoryResult res = CanUnequipItems(srcItemId, count);
1382 if (res != EQUIP_ERR_OK)
1383 {
1384 if (msg)
1385 SendEquipError(res, nullptr, nullptr, srcItemId);
1386 return false;
1387 }
1388
1389 bool destroyItem = true;
1390 for (uint8 n = 0; n < QUEST_ITEM_OBJECTIVES_COUNT; ++n)
1391 if (item->StartQuest == questId && srcItemId == quest->RequiredItemId[n])
1392 destroyItem = false;
1393
1394 if (destroyItem)
1395 DestroyItemCount(srcItemId, count, true, true);
1396 }
1397 }
1398
1399 return true;
1400}
uint32 StartQuest
Definition: ItemTemplate.h:668
InventoryResult CanUnequipItems(uint32 item, uint32 count) const
Definition: PlayerStorage.cpp:273
uint32 GetSrcItemCount() const
Definition: QuestDef.h:259
uint32 GetSrcItemId() const
Definition: QuestDef.h:258

References CanUnequipItems(), DestroyItemCount(), EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), QUEST_ITEM_OBJECTIVES_COUNT, Quest::RequiredItemId, SendEquipError(), sObjectMgr, and ItemTemplate::StartQuest.

Referenced by Spell::EffectQuestClear(), and WorldSession::HandleQuestLogRemoveQuest().

◆ TalkedToCreature()

void Player::TalkedToCreature ( uint32  entry,
ObjectGuid  guid 
)
2113{
2114 uint16 addTalkCount = 1;
2115 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2116 {
2117 uint32 questid = GetQuestSlotQuestId(i);
2118 if (!questid)
2119 continue;
2120
2121 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2122 if (!qInfo)
2123 continue;
2124
2125 QuestStatusData& q_status = m_QuestStatus[questid];
2126
2127 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2128 {
2130 {
2131 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2132 {
2133 // skip Gameobject objectives
2134 if (qInfo->RequiredNpcOrGo[j] < 0)
2135 continue;
2136
2137 uint32 reqTarget = 0;
2138
2139 if (qInfo->RequiredNpcOrGo[j] > 0) // creature activate objectives
2140 // checked at quest_template loading
2141 reqTarget = qInfo->RequiredNpcOrGo[j];
2142 else
2143 continue;
2144
2145 if (reqTarget == entry)
2146 {
2147 uint32 reqTalkCount = qInfo->RequiredNpcOrGoCount[j];
2148 uint16 curTalkCount = q_status.CreatureOrGOCount[j];
2149 if (curTalkCount < reqTalkCount)
2150 {
2151 q_status.CreatureOrGOCount[j] = curTalkCount + addTalkCount;
2152
2153 m_QuestStatusSave[questid] = true;
2154
2155 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curTalkCount, addTalkCount);
2156 }
2157 if (CanCompleteQuest(questid))
2158 CompleteQuest(questid);
2159 else
2161
2162 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2163 continue;
2164 }
2165 }
2166 }
2167 }
2168 }
2169}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by npc_aged_dying_ancient_kodo::OnGossipHello(), brann_bronzebeard::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_razael_and_lyana::OnGossipSelect(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ TeamIdForRace()

TeamId Player::TeamIdForRace ( uint8  race)
static
5852{
5853 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race))
5854 {
5855 switch (rEntry->TeamID)
5856 {
5857 case 1:
5858 return TEAM_HORDE;
5859 case 7:
5860 return TEAM_ALLIANCE;
5861 }
5862 LOG_ERROR("entities.player", "Race ({}) has wrong teamid ({}) in DBC: wrong DBC files?", uint32(race), rEntry->TeamID);
5863 }
5864 else
5865 LOG_ERROR("entities.player", "Race ({}) not found in DBC: wrong DBC files?", uint32(race));
5866
5867 return TEAM_ALLIANCE;
5868}

References LOG_ERROR, sChrRacesStore, TEAM_ALLIANCE, and TEAM_HORDE.

Referenced by CharacterCache::GetCharacterTeamByGuid(), Unit::GetModelForForm(), GetTeamId(), WorldSession::HandleAddFriendOpcode(), WorldSession::HandleCalendarEventInvite(), WorldSession::HandleCharCreateOpcode(), WorldSession::HandleCharFactionOrRaceChangeCallback(), WorldSession::HandleSendMail(), misc_commandscript::HandleSkirmishCommand(), PlayerTaxi::InitTaxiNodesForLevel(), Channel::KickOrBan(), AchievementMgr::LoadFromDB(), and SetFactionForRace().

◆ TeleportTo() [1/2]

bool Player::TeleportTo ( uint32  mapid,
float  x,
float  y,
float  z,
float  orientation,
uint32  options = 0,
Unit target = nullptr,
bool  newInstance = false 
)
1340{
1341 if (!MapMgr::IsValidMapCoord(mapid, x, y, z, orientation))
1342 {
1343 LOG_ERROR("entities.player", "TeleportTo: invalid map ({}) or invalid coordinates (X: {}, Y: {}, Z: {}, O: {}) given when teleporting player ({}, name: {}, map: {}, X: {}, Y: {}, Z: {}, O: {}).",
1344 mapid, x, y, z, orientation, GetGUID().ToString(), GetName(), GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
1345 return false;
1346 }
1347
1348 if (AccountMgr::IsPlayerAccount(GetSession()->GetSecurity()) && sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, mapid, this))
1349 {
1350 LOG_ERROR("entities.player", "Player ({}, name: {}) tried to enter a forbidden map {}", GetGUID().ToString(), GetName(), mapid);
1352 return false;
1353 }
1354
1355 // preparing unsummon pet if lost (we must get pet before teleportation or will not find it later)
1356 Pet* pet = GetPet();
1357
1358 MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
1359
1360 // don't let enter battlegrounds without assigned battleground id (for example through areatrigger)...
1361 if (!InBattleground() && mEntry->IsBattlegroundOrArena())
1362 return false;
1363
1364 // pussywizard: arena spectator, prevent teleporting from arena to instance/etc
1365 if (GetMapId() != mapid && IsSpectator() && mEntry->Instanceable())
1366 {
1368 return false;
1369 }
1370
1371 // client without expansion support
1372 if (GetSession()->Expansion() < mEntry->Expansion())
1373 {
1374 LOG_DEBUG("maps", "Player {} using client without required expansion tried teleport to non accessible map {}", GetName(), mapid);
1375
1376 if (GetTransport())
1377 {
1379 m_transport = nullptr;
1382 RepopAtGraveyard(); // teleport to near graveyard if on transport, looks blizz like :)
1383 }
1384
1386
1387 return false; // normal client can't teleport to this map...
1388 }
1389 else
1390 LOG_DEBUG("maps", "Player {} is being teleported to map {}", GetName(), mapid);
1391
1392 // xinef: do this here in case teleport failed in above checks
1393 if (!(options & TELE_TO_NOT_LEAVE_TAXI) && IsInFlight())
1394 {
1397 }
1398
1399 if (!(options & TELE_TO_NOT_LEAVE_VEHICLE) && m_vehicle)
1400 ExitVehicle();
1401
1402 // reset movement flags at teleport, because player will continue move with these flags after teleport
1404 DisableSpline();
1405
1406 // Xinef: Remove all movement imparing effects auras, skip small teleport like blink
1407 if (mapid != GetMapId() || GetDistance2d(x, y) > 100)
1408 {
1413 // remove auras that should be removed when being teleported
1415 }
1416
1417 if (m_transport)
1418 {
1419 if (options & TELE_TO_NOT_LEAVE_TRANSPORT)
1421 else
1422 {
1424 m_transport = nullptr;
1427 }
1428 }
1429
1430 // The player was ported to another map and loses the duel immediately.
1431 // We have to perform this check before the teleport, otherwise the
1432 // ObjectAccessor won't find the flag.
1435
1436 if (!sScriptMgr->OnPlayerBeforeTeleport(this, mapid, x, y, z, orientation, options, target))
1437 return false;
1438
1439 if (GetMapId() == mapid && !newInstance)
1440 {
1441 //lets reset far teleport flag if it wasn't reset during chained teleports
1443
1444 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1445 //if teleport spell is casted in Unit::Update() func
1446 //then we need to delay it until update process will be finished
1447 if (MustDelayTeleport())
1448 {
1451 //lets save teleport destination for player
1452 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1453 teleportStore_options = options;
1454 return true;
1455 }
1456
1457 if (options & TELE_TO_WITH_PET)
1459
1460 if (!(options & TELE_TO_NOT_UNSUMMON_PET))
1461 {
1462 //same map, only remove pet if out of range for new position
1463 if (pet && !pet->IsWithinDist3d(x, y, z, GetMap()->GetVisibilityRange()))
1465 }
1466
1467 if (!(options & TELE_TO_NOT_LEAVE_COMBAT))
1468 CombatStop();
1469
1470 // this will be used instead of the current location in SaveToDB
1471 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1473
1474 // code for finish transfer called in WorldSession::HandleMovementOpcodes()
1475 // at client packet MSG_MOVE_TELEPORT_ACK
1477 // near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing
1478 if (!GetSession()->PlayerLogout())
1479 {
1480 SetCanTeleport(true);
1481 Position oldPos = GetPosition();
1482 Relocate(x, y, z, orientation);
1484 SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
1485 }
1486 }
1487 else
1488 {
1490 {
1492 return false;
1493 }
1494
1495 // far teleport to another map
1496 Map* oldmap = IsInWorld() ? GetMap() : nullptr;
1497 // check if we can enter before stopping combat / removing pet / totems / interrupting spells
1498
1499 // Check enter rights before map getting to avoid creating instance copy for player
1500 // this check not dependent from map instance copy and same for all instance copies of selected map
1501 if (!(options & TELE_TO_GM_MODE) && sMapMgr->PlayerCannotEnter(mapid, this, false))
1502 return false;
1503
1504 // if PlayerCannotEnter -> CanEnter: checked above
1505 {
1506 //lets reset near teleport flag if it wasn't reset during chained teleports
1508
1509 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1510 //if teleport spell is casted in Unit::Update() func
1511 //then we need to delay it until update process will be finished
1512 if (MustDelayTeleport())
1513 {
1516 //lets save teleport destination for player
1517 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1518 teleportStore_options = options;
1519 return true;
1520 }
1521
1523
1524 CombatStop();
1525
1526 // remove arena spell coldowns/buffs now to also remove pet's cooldowns before it's temporarily unsummoned
1528 {
1529 // KEEP THIS ORDER!
1531 if (pet)
1532 pet->RemoveArenaAuras();
1533
1535 }
1536
1537 // remove pet on map change
1538 if (pet)
1540
1541 // remove all dyn objects
1543
1544 // stop spellcasting
1545 // not attempt interrupt teleportation spell at caster teleport
1546 if (!(options & TELE_TO_SPELL))
1547 if (IsNonMeleeSpellCast(true))
1549
1550 //remove auras before removing from map...
1552
1553 if (!GetSession()->PlayerLogout())
1554 {
1555 // send transfer packets
1556 WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4);
1557 data << uint32(mapid);
1558 if (m_transport)
1559 data << m_transport->GetEntry() << GetMapId();
1560
1561 GetSession()->SendPacket(&data);
1562 }
1563
1564 // remove from old map now
1565 if (oldmap)
1566 oldmap->RemovePlayerFromMap(this, false);
1567
1568 // xinef: do this before setting fall information!
1569 if (IsMounted() && (!GetMap()->GetEntry()->IsDungeon() && !GetMap()->GetEntry()->IsBattlegroundOrArena()) && !m_transport)
1570 {
1572 if (!auras.empty())
1573 {
1574 SetMountBlockId((*auras.begin())->GetId());
1576 }
1577 }
1578
1579 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1581 // if the player is saved before worldportack (at logout for example)
1582 // this will be used instead of the current location in SaveToDB
1583
1584 if (!GetSession()->PlayerLogout())
1585 {
1586 SetCanTeleport(true);
1587 WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4);
1588 data << uint32(mapid);
1589 if (m_transport)
1591 else
1593
1594 GetSession()->SendPacket(&data);
1596 }
1597
1598 // move packet sent by client always after far teleport
1599 // code for finish transfer to new map called in WorldSession::HandleMoveWorldportAckOpcode at client packet
1601 }
1602 }
1603 return true;
1604}
@ MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE
Movement flags that have change status opcodes associated for players.
Definition: UnitDefines.h:414
@ CLASS_CONTEXT_TELEPORT
Definition: UnitDefines.h:228
@ TELE_TO_WITH_PET
Definition: Player.h:833
@ TELE_TO_NOT_LEAVE_TAXI
Definition: Player.h:834
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:832
@ TELE_TO_SPELL
Definition: Player.h:831
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:829
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:830
@ TELE_TO_GM_MODE
Definition: Player.h:827
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:828
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition: Player.h:804
@ AURA_INTERRUPT_FLAG_TELEPORTED
Definition: SpellDefines.h:65
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:47
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ SMSG_NEW_WORLD
Definition: Opcodes.h:92
@ SMSG_TRANSFER_PENDING
Definition: Opcodes.h:93
bool IsWithinDist3d(float x, float y, float z, float dist) const
Definition: Object.cpp:1306
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1274
Position GetPosition() const
Definition: Position.h:147
Position::PositionXYZOStreamer PositionXYZOStream()
Definition: Position.h:154
bool HasPendingSpectatorForBG(uint32 bgInstanceId) const
Definition: Player.h:2590
void SendTeleportAckPacket()
Definition: Player.cpp:1330
void SetSelection(ObjectGuid guid)
Used for serverside target changes, does not apply to players.
Definition: Player.cpp:11503
void SendSavedInstances()
Definition: PlayerStorage.cpp:6557
void SetSemaphoreTeleportNear(time_t tm)
Definition: Player.h:2103
void SetHasDelayedTeleport(bool setting)
Definition: Player.h:2961
void SetSemaphoreTeleportFar(time_t tm)
Definition: Player.h:2104
bool MustDelayTeleport() const
Definition: Player.h:2958
void CleanupAfterTaxiFlight()
Definition: Player.cpp:10378
void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns=false)
Definition: Player.cpp:3539
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
uint32 GetUnitMovementFlags() const
Definition: Unit.h:730
Vehicle * m_vehicle
Definition: Unit.h:2101
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:19772
void SetUnitMovementFlags(uint32 f)
Definition: Unit.h:731
void RemoveAllDynObjects()
Definition: Unit.cpp:6219
void RemoveArenaAuras()
Definition: Unit.cpp:5368
virtual void RemovePlayerFromMap(Player *, bool)
Definition: Map.cpp:752
bool IsBattleArena() const
Definition: DBCStructure.h:1357

References Unit::AddUnitMovementFlag(), AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TELEPORTED, AURA_INTERRUPT_FLAG_TURNING, CLASS_CONTEXT_TELEPORT, CLASS_DEATH_KNIGHT, CleanupAfterTaxiFlight(), Unit::CombatStop(), DISABLE_TYPE_MAP, Unit::DisableSpline(), duel, DUEL_FLED, DuelComplete(), ObjectGuid::Empty, Unit::ExitVehicle(), MapEntry::Expansion(), Unit::GetAuraEffectsByType(), GetBattlegroundId(), WorldObject::GetDistance2d(), Object::GetEntry(), Unit::GetGameObject(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetName(), Position::GetOrientation(), GetPet(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), WorldObject::GetTransport(), Unit::GetUnitMovementFlags(), WorldObject::GetVisibilityRange(), HasPendingSpectatorForBG(), HasSpell(), InBattleground(), MapEntry::Instanceable(), Unit::InterruptNonMeleeSpells(), MapEntry::IsBattleArena(), MapEntry::IsBattlegroundOrArena(), IsClass(), IsGameMaster(), Unit::IsInFlight(), Object::IsInWorld(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), AccountMgr::IsPlayerAccount(), IsSpectator(), MapMgr::IsValidMapCoord(), WorldObject::IsWithinDist3d(), LOG_DEBUG, LOG_ERROR, WorldObject::m_movementInfo, WorldObject::m_transport, Unit::m_vehicle, MAP_EBON_HOLD, MotionMaster::MovementExpired(), MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE, MOVEMENTFLAG_ONTRANSPORT, MustDelayTeleport(), PLAYER_DUEL_ARBITER, MovementInfo::TransportInfo::pos, Position::PositionXYZOStream(), Position::Relocate(), Unit::RemoveAllDynObjects(), Unit::RemoveArenaAuras(), RemoveArenaSpellCooldowns(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), Map::RemovePlayerFromMap(), RepopAtGraveyard(), MovementInfo::TransportInfo::Reset(), sDisableMgr, WorldSession::SendPacket(), SendSavedInstances(), SendTeleportAckPacket(), Unit::SendTeleportPacket(), SendTransferAborted(), SetCanTeleport(), SetFallInformation(), SetHasDelayedTeleport(), SetMountBlockId(), SetSelection(), SetSemaphoreTeleportFar(), SetSemaphoreTeleportNear(), Unit::SetUnitMovementFlags(), sMapMgr, sMapStore, SMSG_NEW_WORLD, SMSG_TRANSFER_PENDING, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_MOUNTED, sScriptMgr, TELE_TO_GM_MODE, TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TAXI, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, teleportStore_dest, teleportStore_options, Position::ToString(), TRANSFER_ABORT_INSUF_EXPAN_LVL, TRANSFER_ABORT_MAP_NOT_ALLOWED, TRANSFER_ABORT_UNIQUE_MESSAGE, MovementInfo::transport, and UnsummonPetTemporaryIfAny().

Referenced by ActivateTaxiPathTo(), BattlegroundSA::CaptureGraveyard(), BattlegroundSA::DefendersPortalTeleport(), MotionTransport::DelayedTeleportTransport(), BattlegroundIC::DoAction(), go_commandscript::DoTeleport(), Spell::EffectTeleportUnits(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleWorldTeleportOpcode(), Unit::NearTeleportTo(), npc_wg_spirit_guide::OnGossipSelect(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), at_orb_of_command::OnTrigger(), at_icc_saurfang_portal::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), Battlefield::PlayerAskToLeave(), BfGraveyard::RelocateDeadPlayers(), Battleground::RelocateDeadPlayers(), Map::RemoveAllPlayers(), RepopAtGraveyard(), ResurectUsingRequestData(), WorldSession::SendSpiritResurrect(), BattlegroundMgr::SendToBattleground(), SummonIfPossible(), lfg::LFGMgr::TeleportPlayer(), GmTicket::TeleportTo(), TeleportTo(), BattlegroundSA::TeleportToEntrancePosition(), TeleportToEntryPoint(), Update(), and GameObject::Use().

◆ TeleportTo() [2/2]

bool Player::TeleportTo ( WorldLocation const &  loc,
uint32  options = 0,
Unit target = nullptr 
)
inline
1110 {
1111 return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options, target);
1112 }

References WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and TeleportTo().

◆ TeleportToEntryPoint()

◆ TextEmote() [1/2]

void Player::TextEmote ( std::string_view  text,
WorldObject const *  = nullptr,
bool  = false 
)
overridevirtual

Outputs an universal text which is supposed to be an action.

Reimplemented from Unit.

9392{
9393 std::string _text(text);
9394
9395 if (!sScriptMgr->OnPlayerCanUseChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text))
9396 {
9397 return;
9398 }
9399
9400 sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text);
9401
9402 WorldPacket data;
9404
9405 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, false, !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE), true);
9406}
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE
Definition: IWorld.h:156
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition: IWorld.h:193
@ CHAT_MSG_EMOTE
Definition: SharedDefines.h:3162
@ LANG_UNIVERSAL
Definition: SharedDefines.h:735

References ChatHandler::BuildChatPacket(), CHAT_MSG_EMOTE, CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, LANG_UNIVERSAL, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ TextEmote() [2/2]

void Player::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
overridevirtual

Reimplemented from Unit.

9409{
9410 Talk(textId, CHAT_MSG_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
9411}

References CHAT_MSG_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToggleAFK()

void Player::ToggleAFK ( )
1299{
1301
1302 // afk player not allowed in battleground
1303 if (!IsGameMaster() && isAFK() && InBattleground())
1305}
void ToggleFlag(uint16 index, uint32 flag)
Definition: Object.cpp:877
void LeaveBattleground(Battleground *bg=nullptr)
Definition: Player.cpp:11269

References InBattleground(), isAFK(), IsGameMaster(), LeaveBattleground(), PLAYER_FLAGS, PLAYER_FLAGS_AFK, and Object::ToggleFlag().

Referenced by Battleground::AddPlayer(), WorldSession::HandleMessagechatOpcode(), Battlefield::PlayerAcceptInviteToWar(), and Unit::SetCharmedBy().

◆ ToggleDND()

void Player::ToggleDND ( )

◆ ToggleInstantFlight()

void Player::ToggleInstantFlight ( )

References m_isInstantFlightOn.

Referenced by OnGossipSelect().

◆ ToggleMetaGemsActive()

void Player::ToggleMetaGemsActive ( uint8  exceptslot,
bool  apply 
)
11200{
11201 //cycle all equipped items
11202 for (int slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11203 {
11204 //enchants for the slot being socketed are handled by WorldSession::HandleSocketOpcode(WorldPacket& recvData)
11205 if (slot == exceptslot)
11206 continue;
11207
11208 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11209
11210 if (!pItem || !pItem->GetTemplate()->Socket[0].Color) //if item has no sockets or no item is equipped go to next item
11211 continue;
11212
11213 //cycle all (gem)enchants
11214 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11215 {
11216 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11217 if (!enchant_id) //if no enchant go to next enchant(slot)
11218 continue;
11219
11220 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11221 if (!enchantEntry)
11222 continue;
11223
11224 //only metagems to be (de)activated, so only enchants with condition
11225 uint32 condition = enchantEntry->EnchantmentCondition;
11226 if (condition)
11227 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), apply);
11228 }
11229 }
11230}

References ApplyEnchantment(), _Socket::Color, SpellItemEnchantmentEntry::EnchantmentCondition, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, ItemTemplate::Socket, and sSpellItemEnchantmentStore.

Referenced by WorldSession::HandleSocketOpcode().

◆ TradeCancel()

void Player::TradeCancel ( bool  sendback,
TradeStatus  status = TRADE_STATUS_TRADE_CANCELED 
)
4089{
4090 if (m_trade)
4091 {
4092 Player* trader = m_trade->GetTrader();
4093
4094 // send yellow "Trade canceled" message to both traders
4095 if (sendback)
4096 GetSession()->SendCancelTrade(status);
4097
4098 trader->GetSession()->SendCancelTrade(status);
4099
4100 // cleanup
4101 delete m_trade;
4102 m_trade = nullptr;
4103 delete trader->m_trade;
4104 trader->m_trade = nullptr;
4105 }
4106}
void SendCancelTrade(TradeStatus status)
Definition: TradeHandler.cpp:527

References GetSession(), TradeData::GetTrader(), m_trade, and WorldSession::SendCancelTrade().

Referenced by ActivateTaxiPathTo(), CleanupsBeforeDelete(), WorldSession::HandleBusyTradeOpcode(), WorldSession::HandleCancelTradeOpcode(), WorldSession::HandleIgnoreTradeOpcode(), and WorldSession::HandleSocketClosed().

◆ UninviteFromGroup()

void Player::UninviteFromGroup ( )
  • If the player is invited, remove him. If the group if then only 1 person, disband the group.
2325{
2326 Group* group = GetGroupInvite();
2327 if (!group)
2328 return;
2329
2330 group->RemoveInvite(this);
2331
2332 if (group->IsCreated())
2333 {
2334 if (group->GetMembersCount() <= 1) // group has just 1 member => disband
2335 {
2336 group->Disband(true);
2337 group = nullptr; // gets deleted in disband
2338 }
2339 }
2340 else
2341 {
2342 if (group->GetInviteeCount() <= 1)
2343 {
2344 group->RemoveAllInvites();
2345 delete group;
2346 group = nullptr;
2347 }
2348 }
2349}
Group * GetGroupInvite()
Definition: Player.h:2476
bool IsCreated() const
Definition: Group.cpp:2285
void RemoveAllInvites()
Definition: Group.cpp:360
void Disband(bool hideDestroy=false)
Definition: Group.cpp:752
void RemoveInvite(Player *player)
Definition: Group.cpp:350
uint32 GetInviteeCount() const
Definition: Group.h:246

References Group::Disband(), GetGroupInvite(), Group::GetInviteeCount(), Group::GetMembersCount(), Group::IsCreated(), Group::RemoveAllInvites(), and Group::RemoveInvite().

Referenced by WorldSession::HandleGroupDeclineOpcode(), and WorldSession::LogoutPlayer().

◆ UnsummonPetTemporaryIfAny()

void Player::UnsummonPetTemporaryIfAny ( )

◆ Update()

void Player::Update ( uint32  time)
overridevirtual
Todo:
add weapon, skill check

Reimplemented from WorldObject.

54{
55 if (!IsInWorld())
56 return;
57
58 sScriptMgr->OnPlayerBeforeUpdate(this, p_time);
59
60 // undelivered mail
62 {
65
66 // It will be recalculate at mailbox open (for unReadMails important
67 // non-0 until mailbox open, it also will be recalculated)
68 m_nextMailDelivereTime = time_t(0);
69 }
70
71 // Update cinematic location, if 500ms have passed and we're doing a
72 // cinematic now.
75 {
78 }
79
80 // used to implement delayed far teleports
83 Unit::Update(p_time);
85
86 time_t now = GameTime::GetGameTime().count();
87
88 UpdatePvPFlag(now);
90
91 UpdateContestedPvP(p_time);
92
93 UpdateDuelFlag(now);
94
96
97 UpdateAfkReport(now);
98
99 // Xinef: update charm AI only if we are controlled by creature or
100 // non-posses player charm
102 {
103 m_charmUpdateTimer += p_time;
104 if (m_charmUpdateTimer >= 1000)
105 {
107 if (Unit* charmer = GetCharmer())
108 if (charmer->IsAlive())
110 }
111 }
112
113 time_t lastTick = m_Last_tick;
114 if (now > m_Last_tick)
115 {
116 // Update items that have just a limited lifetime
118
119 // check every minute, less chance to crash and wont break anything.
121
122 // Played time
123 uint32 elapsed = uint32(now - m_Last_tick);
124 m_Played_time[PLAYED_TIME_TOTAL] += elapsed; // Total played time
125 m_Played_time[PLAYED_TIME_LEVEL] += elapsed; // Level played time
126 GetSession()->SetTotalTime(GetSession()->GetTotalTime() + elapsed);
127 m_Last_tick = now;
128 }
129
130 // If mute expired, remove it from the DB
131 if (GetSession()->m_muteTime && GetSession()->m_muteTime < now)
132 {
133 GetSession()->m_muteTime = 0;
135 LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
136 stmt->SetData(0, 0); // Set the mute time to 0
137 stmt->SetData(1, "");
138 stmt->SetData(2, "");
139 stmt->SetData(3, GetSession()->GetAccountId());
140 LoginDatabase.Execute(stmt);
141 }
142
143 if (!m_timedquests.empty())
144 {
145 QuestSet::iterator iter = m_timedquests.begin();
146 while (iter != m_timedquests.end())
147 {
148 QuestStatusData& q_status = m_QuestStatus[*iter];
149 if (q_status.Timer <= p_time)
150 {
151 uint32 quest_id = *iter;
152 ++iter; // current iter will be removed in FailQuest
153 FailQuest(quest_id);
154 }
155 else
156 {
157 q_status.Timer -= p_time;
158 m_QuestStatusSave[*iter] = true;
159 ++iter;
160 }
161 }
162 }
163
164 m_achievementMgr->Update(p_time);
165
167 {
168 if (Unit* victim = GetVictim())
169 {
170 // default combat reach 10
172
174 {
175 if (!IsWithinMeleeRange(victim))
176 {
178 if (m_swingErrorMsg != 1) // send single time (client auto repeat)
179 {
181 m_swingErrorMsg = 1;
182 }
183 }
184 // 120 degrees of radiant range
185 else if (!HasInArc(2 * M_PI / 3, victim))
186 {
188 if (m_swingErrorMsg != 2) // send single time (client auto repeat)
189 {
191 m_swingErrorMsg = 2;
192 }
193 }
194 else
195 {
196 m_swingErrorMsg = 0; // reset swing error state
197
198 // prevent base and off attack in same time, delay attack at
199 // 0.2 sec
203
204 // do attack
207 }
208 }
209
211 {
212 if (!IsWithinMeleeRange(victim))
214 else if (!HasInArc(2 * M_PI / 3, victim))
216 else
217 {
218 // prevent base and off attack in same time, delay attack at
219 // 0.2 sec
222
223 // do attack
226 }
227 }
228
229 /*Unit* owner = victim->GetOwner();
230 Unit* u = owner ? owner : victim;
231 if (u->IsPvP() && (!duel || duel->opponent != u))
232 {
233 UpdatePvP(true);
234 RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
235 }*/
236 }
237 }
238
240 {
241 if (now > lastTick && _restTime > 0) // freeze update
242 {
243 time_t currTime = GameTime::GetGameTime().count();
244 time_t timeDiff = currTime - _restTime;
245 if (timeDiff >= 10) // freeze update
246 {
247 _restTime = currTime;
248
249 float bubble = 0.125f * sWorld->getRate(RATE_REST_INGAME);
250 float extraPerSec =
251 ((float) GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000.0f) *
252 bubble;
253
254 // speed collect rest bonus (section/in hour)
255 SetRestBonus(GetRestBonus() + timeDiff * extraPerSec);
256 }
257 }
258 }
259
260 if (m_weaponChangeTimer > 0)
261 {
262 if (p_time >= m_weaponChangeTimer)
264 else
265 m_weaponChangeTimer -= p_time;
266 }
267
268 if (!IsPositionValid()) // pussywizard: will crash below at eg. GetZoneAndAreaId
269 {
270 LOG_INFO("misc", "Player::Update - invalid position ({:0.1f}, {:0.1f}, {:0.1f})! Map: {}, MapId: {}, {}",
272 GetSession()->KickPlayer("Invalid position");
273 return;
274 }
275
276 if (m_zoneUpdateTimer > 0)
277 {
278 if (p_time >= m_zoneUpdateTimer)
279 {
280 // On zone update tick check if we are still in an inn if we are
281 // supposed to be in one
283 {
284 AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(GetInnTriggerId());
285 if (!atEntry || !IsInAreaTriggerRadius(atEntry, 5.f))
286 {
288 }
289 }
290
291 uint32 newzone, newarea;
292 GetZoneAndAreaId(newzone, newarea);
293
294 if (m_zoneUpdateId != newzone)
295 UpdateZone(newzone, newarea); // also update area
296 else
297 {
298 // use area updates as well
299 // needed for free far all arenas for example
300 if (m_areaUpdateId != newarea)
301 UpdateArea(newarea);
302 }
303
305 }
306 else
307 m_zoneUpdateTimer -= p_time;
308 }
309
310 sScriptMgr->OnPlayerUpdate(this, p_time);
311
312 if (IsAlive())
313 {
314 m_regenTimer += p_time;
316 }
317
318 if (m_deathState == DeathState::JustDied)
319 KillPlayer();
320
321 if (m_nextSave)
322 {
323 if (p_time >= m_nextSave)
324 {
325 // m_nextSave reset in SaveToDB call
326 SaveToDB(false, false);
327 LOG_DEBUG("entities.player", "Player::Update: Player '{}' ({}) saved", GetName(), GetGUID().ToString());
328 }
329 else
330 {
331 m_nextSave -= p_time;
332 }
333 }
334
335 // Handle Water/drowning
336 HandleDrowning(p_time);
337
338 if (GetDrunkValue())
339 {
340 m_drunkTimer += p_time;
343 }
344
345 if (HasPendingBind())
346 {
347 if (_pendingBindTimer <= p_time)
348 {
349 // Player left the instance
352 SetPendingBind(0, 0);
353 }
354 else
355 _pendingBindTimer -= p_time;
356 }
357
358 // not auto-free ghost from body in instances
359 if (m_deathTimer > 0 && !GetMap()->Instanceable() &&
361 {
362 if (p_time >= m_deathTimer)
363 {
364 m_deathTimer = 0;
367 }
368 else
369 m_deathTimer -= p_time;
370 }
371
372 UpdateEnchantTime(p_time);
373 UpdateHomebindTime(p_time);
374
375 if (!_instanceResetTimes.empty())
376 {
377 for (InstanceTimeMap::iterator itr = _instanceResetTimes.begin();
378 itr != _instanceResetTimes.end();)
379 {
380 if (itr->second < now)
381 _instanceResetTimes.erase(itr++);
382 else
383 ++itr;
384 }
385 }
386
387 // group update
389
390 Pet* pet = GetPet();
391 if (pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityRange()) &&
392 !pet->isPossessed())
393 // if (pet && !pet->IsWithinDistInMap(this,
394 // GetMap()->GetVisibilityDistance()) && (GetCharmGUID() &&
395 // (pet->GetGUID()
396 // != GetCharmGUID())))
398
399 // pussywizard:
400 if (m_hostileReferenceCheckTimer <= p_time)
401 {
403 if (!GetMap()->IsDungeon())
406 }
407 else
409
410 // we should execute delayed teleports only for alive(!) players
411 // because we don't want player's ghost teleported from graveyard
412 // xinef: so we store it to the end of the world and teleport out of the ass
413 // after resurrection?
414 if (HasDelayedTeleport() /* && IsAlive()*/)
415 {
418 }
419
421 {
423 UpdateObjectVisibility(true, true);
426 }
427}
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:69
#define ATTACK_DISPLAY_DELAY
Definition: Unit.h:614
@ UNIT_STATE_CHARGING
Definition: UnitDefines.h:187
@ UNIT_STATE_CASTING
Definition: UnitDefines.h:185
@ UNIT_FLAG_POSSESSED
Definition: UnitDefines.h:274
constexpr auto ZONE_UPDATE_INTERVAL
Definition: PlayerUpdates.cpp:51
constexpr auto CINEMATIC_UPDATEDIFF
Definition: CinematicMgr.h:26
@ RATE_REST_INGAME
Definition: IWorld.h:507
@ LOGIN_UPD_MUTE_TIME
Definition: LoginDatabase.h:72
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition: DatabaseEnv.cpp:22
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:131
void Update(uint32 timeDiff)
Definition: AchievementMgr.cpp:2184
void deleteReferencesOutOfRange(float range)
Definition: HostileRefMgr.cpp:199
void RemoveFromNotify(uint16 f)
Definition: Object.h:574
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition: Position.cpp:141
std::vector< FlyByCamera > const * m_cinematicCamera
Definition: CinematicMgr.h:56
uint32 m_cinematicDiff
Definition: CinematicMgr.h:52
uint32 m_lastCinematicCheck
Definition: CinematicMgr.h:53
uint32 m_activeCinematicCameraId
Definition: CinematicMgr.h:54
void UpdateCinematicLocation(uint32 diff)
Definition: CinematicMgr.cpp:92
void UpdateEnchantTime(uint32 time)
Definition: PlayerStorage.cpp:4162
uint32 GetInnTriggerId() const
Definition: Player.h:1218
void UpdateContestedPvP(uint32 currTime)
Definition: PlayerMisc.cpp:360
void SendAttackSwingBadFacingAttack()
Definition: PlayerMisc.cpp:146
void SendUpdateToOutOfRangeGroupMembers()
Definition: Player.cpp:11652
void KillPlayer()
Definition: Player.cpp:4559
void UpdateDuelFlag(time_t currTime)
Definition: PlayerMisc.cpp:423
bool HasRestFlag(RestFlag restFlag) const
Definition: Player.h:1215
bool HasDelayedTeleport() const
Definition: Player.h:2960
void SendAttackSwingNotInRange()
Definition: PlayerMisc.cpp:78
void UpdateSoulboundTradeItems()
Definition: PlayerStorage.cpp:4108
void RemoveRestFlag(RestFlag restFlag)
Definition: Player.cpp:16106
void CheckDuelDistance(time_t currTime)
Definition: Player.cpp:6390
void UpdatePvPFlag(time_t currTime)
Definition: PlayerMisc.cpp:372
void HandleSobering()
The player sobers by 1% every 9 seconds.
Definition: Player.cpp:957
void UpdateFFAPvPFlag(time_t currTime)
Definition: PlayerMisc.cpp:391
void BindToInstance()
Definition: PlayerStorage.cpp:6508
void FailQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:886
void ProcessSpellQueue()
Definition: PlayerUpdates.cpp:2376
void HandleDrowning(uint32 time_diff)
Definition: Player.cpp:840
void UpdateCharmedAI()
Definition: PlayerUpdates.cpp:1954
void UpdateHomebindTime(uint32 time)
Definition: PlayerUpdates.cpp:1397
bool IsInAreaTriggerRadius(AreaTrigger const *trigger, float delta=0.f) const
Definition: Player.cpp:2191
void RegenerateAll()
Definition: Player.cpp:1762
void UpdateAfkReport(time_t currTime)
checks the 15 afk reports per 5 minutes limit
Definition: PlayerMisc.cpp:351
bool HasOffhandWeaponForAttack() const
Definition: Unit.h:927
bool IsCharmed() const
Definition: Unit.h:1235
Unit * GetCharmer() const
Definition: Unit.cpp:10652
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:828
bool IsWithinMeleeRange(Unit const *obj, float dist=0.f) const
Definition: Unit.cpp:665
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:2016
bool isPossessed() const
Definition: Unit.h:1236
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2577
void Update(uint32 time) override
Definition: Unit.cpp:383
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:830
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:831
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:643
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:2014
Definition: ObjectMgr.h:420
void SetTotalTime(uint32 TotalTime)
Definition: WorldSession.h:389
void KickPlayer(bool setKicked=true)
Definition: WorldSession.h:414

References _cinematicMgr, _instanceResetTimes, _pendingBindId, _pendingBindTimer, _restTime, ATTACK_DISPLAY_DELAY, Unit::AttackerStateUpdate(), BASE_ATTACK, BindToInstance(), Unit::bRequestForcedVisibilityUpdate, BuildPlayerRepop(), CheckDuelDistance(), CINEMATIC_UPDATEDIFF, HostileRefMgr::deleteReferencesOutOfRange(), FailQuest(), WorldObject::FindMap(), Unit::getAttackTimer(), Unit::GetCharmer(), GetDrunkValue(), GameTime::GetGameTime(), Object::GetGUID(), Unit::getHostileRefMgr(), GetInnTriggerId(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), getMSTime(), GetMSTimeDiffToNow(), WorldObject::GetName(), GetPet(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetRestBonus(), GetSession(), Object::GetUInt32Value(), Unit::GetVictim(), WorldObject::GetVisibilityRange(), WorldObject::GetZoneAndAreaId(), HandleDrowning(), HandleSobering(), HasDelayedTeleport(), Position::HasInArc(), Unit::HasOffhandWeaponForAttack(), HasPendingBind(), HasPlayerFlag(), Unit::HasPreventResurectionAura(), HasRestFlag(), Unit::HasUnitFlag(), Unit::HasUnitState(), IN_MILLISECONDS, Unit::IsAlive(), Unit::isAttackReady(), IsBeingTeleported(), Unit::IsCharmed(), IsInAreaTriggerRadius(), Object::IsInWorld(), Position::IsPositionValid(), Unit::isPossessed(), WorldObject::IsWithinDistInMap(), Unit::IsWithinMeleeRange(), WorldSession::KickPlayer(), KillPlayer(), LOG_DEBUG, LOG_INFO, LOGIN_UPD_MUTE_TIME, LoginDatabase, m_achievementMgr, CinematicMgr::m_activeCinematicCameraId, m_areaUpdateId, m_charmUpdateTimer, CinematicMgr::m_cinematicCamera, CinematicMgr::m_cinematicDiff, Unit::m_deathState, m_deathTimer, Unit::m_delayed_unit_relocation_timer, m_drunkTimer, m_hostileReferenceCheckTimer, m_Last_tick, CinematicMgr::m_lastCinematicCheck, WorldSession::m_muteTime, m_nextMailDelivereTime, m_nextSave, m_Played_time, m_QuestStatus, m_QuestStatusSave, Unit::m_regenTimer, m_swingErrorMsg, m_timedquests, m_weaponChangeTimer, m_zoneUpdateId, m_zoneUpdateTimer, NOTIFY_VISIBILITY_CHANGED, OFF_ATTACK, PET_SAVE_NOT_IN_SLOT, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_FLAGS_RESTING, PLAYER_NEXT_LEVEL_XP, ProcessSpellQueue(), RATE_REST_INGAME, RegenerateAll(), WorldObject::RemoveFromNotify(), RemovePet(), RemoveRestFlag(), RepopAtGraveyard(), Unit::resetAttackTimer(), REST_FLAG_IN_TAVERN, SaveToDB(), SendAttackSwingBadFacingAttack(), SendAttackSwingNotInRange(), SendNewMail(), SendUpdateToOutOfRangeGroupMembers(), Unit::setAttackTimer(), PreparedStatementBase::SetData(), SetHasDelayedTeleport(), SetMustDelayTeleport(), SetPendingBind(), SetRestBonus(), WorldSession::SetTotalTime(), sObjectMgr, sScriptMgr, sWorld, teleportStore_dest, teleportStore_options, TeleportTo(), QuestStatusData::Timer, Position::ToString(), UNIT_FLAG_POSSESSED, UNIT_STATE_CASTING, UNIT_STATE_CHARGING, UNIT_STATE_MELEE_ATTACKING, unReadMails, Unit::Update(), AchievementMgr::Update(), UpdateAfkReport(), UpdateArea(), UpdateCharmedAI(), CinematicMgr::UpdateCinematicLocation(), UpdateContestedPvP(), UpdateDuelFlag(), UpdateEnchantTime(), UpdateFFAPvPFlag(), UpdateHomebindTime(), UpdateItemDuration(), UpdateObjectVisibility(), UpdatePvPFlag(), UpdateSoulboundTradeItems(), UpdateZone(), and ZONE_UPDATE_INTERVAL.

Referenced by Map::Update().

◆ UpdateAchievementCriteria()

void Player::UpdateAchievementCriteria ( AchievementCriteriaTypes  type,
uint32  miscValue1 = 0,
uint32  miscValue2 = 0,
Unit unit = nullptr 
)
2181{
2182 m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2,
2183 unit);
2184}
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: AchievementMgr.cpp:818

References m_achievementMgr, and AchievementMgr::UpdateAchievementCriteria().

Referenced by _addSpell(), Spell::_cast(), KillRewarder::_RewardKillCredit(), ActivateTaxiPathTo(), CheckAreaExploreAndOutdoor(), Group::CountTheRoll(), Unit::DealDamage(), Spell::DoSpellHitOnUnit(), FlightPathMovementGenerator::DoUpdate(), InstanceScript::DoUpdateAchievementCriteria(), DuelComplete(), EnvironmentalDamage(), EquipItem(), EquipNewItem(), lfg::LFGMgr::FinishDungeon(), GiveLevel(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuyBankSlotOpcode(), HandleFall(), WorldSession::HandleGameobjectReportUse(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleQuestLogRemoveQuest(), reset_commandscript::HandleResetHonorCommand(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleTextEmoteOpcode(), Unit::Kill(), KilledMonsterCredit(), ArenaTeamMember::ModifyPersonalRating(), MoveItemToInventory(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), InstanceSaveMgr::PlayerBindToInstance(), QuickEquipItem(), resetTalents(), RewardHonor(), RewardQuest(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), setDeathState(), SetMoney(), ReputationMgr::SetOneFactionReputation(), SetSkill(), SetTitle(), StoreNewItem(), SummonIfPossible(), UpdateLootAchievements(), BattlegroundAB::UpdatePlayerScore(), BattlegroundAV::UpdatePlayerScore(), BattlegroundEY::UpdatePlayerScore(), BattlegroundIC::UpdatePlayerScore(), BattlegroundWS::UpdatePlayerScore(), UpdateSkill(), UpdateSkillPro(), and GameObject::Use().

◆ UpdateAfkReport()

void Player::UpdateAfkReport ( time_t  currTime)

checks the 15 afk reports per 5 minutes limit

352{
353 if (m_bgData.bgAfkReportedTimer <= currTime)
354 {
356 m_bgData.bgAfkReportedTimer = currTime + 5 * MINUTE;
357 }
358}
time_t bgAfkReportedTimer
Definition: Player.h:1050

References BGData::bgAfkReportedCount, BGData::bgAfkReportedTimer, m_bgData, and MINUTE.

Referenced by Update().

◆ UpdateAllCritPercentages()

void Player::UpdateAllCritPercentages ( )

◆ UpdateAllRatings()

void Player::UpdateAllRatings ( )
703{
704 for (int cr = 0; cr < MAX_COMBAT_RATING; ++cr)
706}
CombatRating
Definition: Unit.h:217

References MAX_COMBAT_RATING, and UpdateRating().

Referenced by UpdateAllStats().

◆ UpdateAllSpellCritChances()

void Player::UpdateAllSpellCritChances ( )
872{
873 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
875}
@ SPELL_SCHOOL_NORMAL
Definition: SharedDefines.h:283
void UpdateSpellCritChance(uint32 school)
Definition: StatSystem.cpp:822

References MAX_SPELL_SCHOOL, SPELL_SCHOOL_NORMAL, and UpdateSpellCritChance().

Referenced by AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleModSpellCritChance(), UpdateAllStats(), UpdateRating(), and UpdateStats().

◆ UpdateAllStats()

bool Player::UpdateAllStats ( )
overridevirtual

Implements Unit.

189{
190 for (int8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
191 {
192 float value = GetTotalStatValue(Stats(i));
193 SetStat(Stats(i), int32(value));
194 }
195
196 UpdateArmor();
197 // calls UpdateAttackPowerAndDamage() in UpdateArmor for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
200
201 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
203
215
216 return true;
217}
void UpdateAllSpellCritChances()
Definition: StatSystem.cpp:871
void UpdateArmor() override
Definition: StatSystem.cpp:252
void UpdateSpellDamageAndHealingBonus()
Definition: StatSystem.cpp:177
void UpdateMaxHealth() override
Definition: StatSystem.cpp:296
void UpdateAllRatings()
Definition: PlayerUpdates.cpp:702
void UpdateAllCritPercentages()
Definition: StatSystem.cpp:680
void UpdateDefenseBonusesMod()
Definition: StatSystem.cpp:609
virtual void UpdateAllResistances()
Definition: StatSystem.cpp:54
float GetTotalStatValue(Stats stat, float additionalValue=0.0f) const
Definition: Unit.cpp:15353

References BASE_ATTACK, CR_ARMOR_PENETRATION, Unit::GetTotalStatValue(), MAX_POWERS, MAX_STATS, OFF_ATTACK, POWER_MANA, RecalculateRating(), Unit::SetStat(), STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllRatings(), Unit::UpdateAllResistances(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDefenseBonusesMod(), UpdateExpertise(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

Referenced by _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), Create(), GiveLevel(), and LoadFromDB().

◆ UpdateArea()

void Player::UpdateArea ( uint32  newArea)
1216{
1217 // pussywizard: inform instance, needed for Icecrown Citadel
1218 if (InstanceScript* instance = GetInstanceScript())
1219 instance->OnPlayerAreaUpdate(this, m_areaUpdateId, newArea);
1220
1221 sScriptMgr->OnPlayerUpdateArea(this, m_areaUpdateId, newArea);
1222
1223 // FFA_PVP flags are area and not zone id dependent
1224 // so apply them accordingly
1225 m_areaUpdateId = newArea;
1226
1227 AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea);
1228 pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA);
1229 UpdateFFAPvPState(false);
1230
1231 UpdateAreaDependentAuras(newArea);
1232
1233 pvpInfo.IsInNoPvPArea = false;
1234 if (area && area->IsSanctuary())
1235 {
1237 pvpInfo.IsInNoPvPArea = true;
1239 }
1240 else
1242
1243 uint32 const areaRestFlag = (GetTeamId(true) == TEAM_ALLIANCE)
1246 if (area && area->flags & areaRestFlag)
1248 else
1250}
@ REST_FLAG_IN_FACTION_AREA
Definition: Player.h:822
@ AREA_FLAG_ARENA
Definition: DBCEnums.h:241
@ AREA_FLAG_REST_ZONE_HORDE
Definition: DBCEnums.h:256
@ AREA_FLAG_REST_ZONE_ALLIANCE
Definition: DBCEnums.h:257
bool IsInNoPvPArea
‍Marks if player is in an area which forces PvP flag
Definition: Player.h:368
bool IsInFFAPvPArea
‍Marks if player is in a sanctuary or friendly capital city
Definition: Player.h:369
void UpdateFFAPvPState(bool reset=true)
Definition: PlayerUpdates.cpp:1457
bool IsSanctuary() const
Definition: DBCStructure.h:533

References AREA_FLAG_ARENA, AREA_FLAG_REST_ZONE_ALLIANCE, AREA_FLAG_REST_ZONE_HORDE, Unit::CombatStopWithPets(), AreaTableEntry::flags, WorldObject::GetInstanceScript(), GetTeamId(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_areaUpdateId, pvpInfo, Object::RemoveByteFlag(), RemoveRestFlag(), REST_FLAG_IN_FACTION_AREA, sAreaTableStore, Object::SetByteFlag(), SetRestFlag(), sScriptMgr, TEAM_ALLIANCE, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_BYTES_2, UpdateAreaDependentAuras(), and UpdateFFAPvPState().

Referenced by SetGameMaster(), Update(), and UpdateZone().

◆ UpdateAreaDependentAuras()

void Player::UpdateAreaDependentAuras ( uint32  area_id)
1868{
1869 // remove auras from spells with area limitations
1870 for (AuraMap::iterator iter = m_ownedAuras.begin();
1871 iter != m_ownedAuras.end();)
1872 {
1873 // use m_zoneUpdateId for speed: UpdateArea called from UpdateZone or
1874 // instead UpdateZone in both cases m_zoneUpdateId up-to-date
1875 if (iter->second->GetSpellInfo()->CheckLocation(
1876 GetMapId(), m_zoneUpdateId, newArea, this, false) !=
1878 RemoveOwnedAura(iter);
1879 else
1880 ++iter;
1881 }
1882
1883 // Xinef: check controlled auras
1884 if (!m_Controlled.empty())
1885 for (ControlSet::iterator itr = m_Controlled.begin();
1886 itr != m_Controlled.end();)
1887 {
1888 Unit* controlled = *itr;
1889 ++itr;
1890 if (controlled && !controlled->IsPet())
1891 {
1892 Unit::AuraMap& tAuras = controlled->GetOwnedAuras();
1893 for (Unit::AuraMap::iterator auraIter = tAuras.begin();
1894 auraIter != tAuras.end();)
1895 {
1896 if (auraIter->second->GetSpellInfo()->CheckLocation(
1897 GetMapId(), m_zoneUpdateId, newArea, nullptr) !=
1899 controlled->RemoveOwnedAura(auraIter);
1900 else
1901 ++auraIter;
1902 }
1903 }
1904 }
1905
1906 // some auras applied at subzone enter
1907 SpellAreaForAreaMapBounds saBounds =
1908 sSpellMgr->GetSpellAreaForAreaMapBounds(newArea);
1909 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1910 itr != saBounds.second; ++itr)
1911 if (itr->second->autocast &&
1912 itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea))
1913 if (!HasAura(itr->second->spellId))
1914 CastSpell(this, itr->second->spellId, true);
1915
1916 if (newArea == 4273 && GetVehicle() && GetPositionX() > 400) // Ulduar
1917 {
1918 switch (GetVehicleBase()->GetEntry())
1919 {
1920 case 33062:
1921 case 33109:
1922 case 33060:
1923 GetVehicle()->Dismiss();
1924 break;
1925 }
1926 }
1927}
std::pair< SpellAreaForAreaMap::const_iterator, SpellAreaForAreaMap::const_iterator > SpellAreaForAreaMapBounds
Definition: SpellMgr.h:550
Unit * GetVehicleBase() const
Definition: Unit.cpp:18775
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:625
AuraMap & GetOwnedAuras()
Definition: Unit.h:1294
void Dismiss()
Definition: Vehicle.cpp:539

References Unit::CastSpell(), Vehicle::Dismiss(), Object::GetEntry(), WorldLocation::GetMapId(), Unit::GetOwnedAuras(), Position::GetPositionX(), Unit::GetVehicle(), Unit::GetVehicleBase(), Unit::HasAura(), Unit::IsPet(), Unit::m_Controlled, Unit::m_ownedAuras, m_zoneUpdateId, Unit::RemoveOwnedAura(), SPELL_CAST_OK, and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), and UpdateArea().

◆ UpdateArmor()

void Player::UpdateArmor ( )
overridevirtual

Implements Unit.

253{
254 UnitMods unitMod = UNIT_MOD_ARMOR;
255
256 float value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
257 value *= GetModifierValue(unitMod, BASE_PCT); // armor percent from items
258 value += GetStat(STAT_AGILITY) * 2.0f; // armor bonus from stats
259 value += GetModifierValue(unitMod, TOTAL_VALUE);
260
261 //add dynamic flat mods
263 for (AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
264 {
265 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
266 value += CalculatePct(GetStat(Stats((*i)->GetMiscValueB())), (*i)->GetAmount());
267 }
268
269 value *= GetModifierValue(unitMod, TOTAL_PCT);
270
271 SetArmor(int32(value));
272
273 UpdateAttackPowerAndDamage(); // armor dependent auras update for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
274}
@ SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:245

References BASE_PCT, BASE_VALUE, CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetArmor(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_MASK_NORMAL, STAT_AGILITY, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, and UpdateAttackPowerAndDamage().

Referenced by UpdateAllStats(), UpdateResistances(), and UpdateStats().

◆ UpdateArmorPenetration()

void Player::UpdateArmorPenetration ( int32  amount)
848{
849 // Store Rating Value
851}

References CR_ARMOR_PENETRATION, PLAYER_FIELD_COMBAT_RATING_1, and Unit::SetUInt32Value().

Referenced by UpdateRating().

◆ UpdateAttackPowerAndDamage()

void Player::UpdateAttackPowerAndDamage ( bool  ranged = false)
overridevirtual

Implements Unit.

331{
332 float val2 = 0.0f;
333 float level = float(GetLevel());
334
335 sScriptMgr->OnPlayerBeforeUpdateAttackPowerAndDamage(this, level, val2, ranged);
336
338
342
343 if (ranged)
344 {
348
350 {
351 val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f;
352 }
354 {
355 val2 = level + GetStat(STAT_AGILITY) - 10.0f;
356 }
358 {
359 switch (GetShapeshiftForm())
360 {
361 case FORM_CAT:
362 case FORM_BEAR:
363 case FORM_DIREBEAR:
364 val2 = 0.0f;
365 break;
366 default:
367 val2 = GetStat(STAT_AGILITY) - 10.0f;
368 break;
369 }
370 }
371 else
372 {
373 val2 = GetStat(STAT_AGILITY) - 10.0f;
374 }
375 }
376 else
377 {
379 {
380 val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
381 }
383 {
384 val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f;
385 }
387 {
388 // Check if Predatory Strikes is skilled
389 float mLevelMult = 0.0f;
390 float weapon_bonus = 0.0f;
391 if (IsInFeralForm())
392 {
394 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
395 {
396 AuraEffect* aurEff = *itr;
397 if (aurEff->GetSpellInfo()->SpellIconID == 1563)
398 {
399 switch (aurEff->GetEffIndex())
400 {
401 case 0: // Predatory Strikes (effect 0)
402 mLevelMult = CalculatePct(1.0f, aurEff->GetAmount());
403 break;
404 case 1: // Predatory Strikes (effect 1)
405 if (Item* mainHand = m_items[EQUIPMENT_SLOT_MAINHAND])
406 {
407 // also gains % attack power from equipped weapon
408 ItemTemplate const* proto = mainHand->GetTemplate();
409 if (!proto)
410 continue;
411
412 uint32 ap = proto->getFeralBonus();
413 // Get AP Bonuses from weapon
414 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
415 {
416 if (i >= proto->StatsCount)
417 break;
418
420 ap += proto->ItemStat[i].ItemStatValue;
421 }
422
423 // Get AP Bonuses from weapon spells
424 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
425 {
426 // no spell
427 if (!proto->Spells[i].SpellId || proto->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
428 continue;
429
430 // check if it is valid spell
431 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(proto->Spells[i].SpellId);
432 if (!spellproto)
433 continue;
434
435 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
436 if (spellproto->Effects[j].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER)
437 ap += spellproto->Effects[j].CalcValue();
438 }
439
440 weapon_bonus = CalculatePct(float(ap), aurEff->GetAmount());
441 }
442 break;
443 default:
444 break;
445 }
446 }
447 }
448 }
449
450 switch (GetShapeshiftForm())
451 {
452 case FORM_CAT:
453 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + weapon_bonus + m_baseFeralAP;
454 break;
455 case FORM_BEAR:
456 case FORM_DIREBEAR:
457 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + weapon_bonus + m_baseFeralAP;
458 break;
459 case FORM_MOONKIN:
460 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP;
461 break;
462 default:
463 val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
464 break;
465 }
466 }
468 {
469 val2 = GetStat(STAT_STRENGTH) - 10.0f;
470 }
471 }
472
473 SetModifierValue(unitMod, BASE_VALUE, val2);
474
475 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
476 float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
477
478 //add dynamic flat mods
479 if (ranged)
480 {
481 if ((getClassMask() & CLASSMASK_WAND_USERS) == 0)
482 {
484 for (AuraEffectList::const_iterator i = mRAPbyStat.begin(); i != mRAPbyStat.end(); ++i)
485 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
486 }
487 }
488 else
489 {
491 for (AuraEffectList::const_iterator i = mAPbyStat.begin(); i != mAPbyStat.end(); ++i)
492 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
493
495 for (AuraEffectList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)
496 // always: ((*i)->GetModifier()->m_miscvalue == 1 == SPELL_SCHOOL_MASK_NORMAL)
497 attPowerMod += int32(GetArmor() / (*iter)->GetAmount());
498 }
499
500 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
501
502 sScriptMgr->OnPlayerAfterUpdateAttackPowerAndDamage(this, level, base_attPower, attPowerMod, attPowerMultiplier, ranged);
503 SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
504 SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
505 SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
506
507 //automatically update weapon damage after attack power modification
508 if (ranged)
509 {
511 }
512 else
513 {
515 if (CanDualWield() && HasOffhandWeaponForAttack()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
519 }
520}
@ FORM_MOONKIN
Definition: UnitDefines.h:98
@ SPELL_AURA_MOD_ATTACK_POWER
Definition: SpellAuraDefines.h:162
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:275
@ SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
Definition: SpellAuraDefines.h:348
@ SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:331
int32 ItemStatValue
Definition: ItemTemplate.h:587
uint32 ItemStatType
Definition: ItemTemplate.h:586
_ItemStat ItemStat[MAX_ITEM_PROTO_STATS]
Definition: ItemTemplate.h:648
int32 getFeralBonus(int32 extraDPS=0) const
Definition: ItemTemplate.h:744
uint32 StatsCount
Definition: ItemTemplate.h:647
void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value)
Definition: Unit.h:1013
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:64

References BASE_ATTACK, BASE_PCT, BASE_VALUE, CalculatePct(), Unit::CanDualWield(), CLASS_CONTEXT_STATS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CLASSMASK_WAND_USERS, SpellInfo::Effects, EQUIPMENT_SLOT_MAINHAND, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, AuraEffect::GetAmount(), Unit::GetArmor(), Unit::GetAuraEffectsByType(), Unit::getClassMask(), AuraEffect::GetEffIndex(), ItemTemplate::getFeralBonus(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Unit::GetStat(), Unit::HasOffhandWeaponForAttack(), IsClass(), Unit::IsInFeralForm(), ITEM_MOD_ATTACK_POWER, ITEM_SPELLTRIGGER_ON_EQUIP, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, m_baseFeralAP, m_items, MAX_ITEM_PROTO_SPELLS, MAX_ITEM_PROTO_STATS, MAX_SPELL_EFFECTS, OFF_ATTACK, RANGED_ATTACK, Object::SetFloatValue(), Object::SetInt32Value(), Unit::SetModifierValue(), SPELL_AURA_DUMMY, SPELL_AURA_MOD_ATTACK_POWER, SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR, SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SpellInfo::SpellIconID, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellMgr, STAT_AGILITY, STAT_STRENGTH, ItemTemplate::StatsCount, TOTAL_PCT, TOTAL_VALUE, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, Unit::UpdateDamagePhysical(), and UpdateSpellDamageAndHealingBonus().

Referenced by ApplyFeralAPBonus(), AuraEffect::HandleAuraModAttackPowerOfArmor(), AuraEffect::HandleAuraModRangedAttackPowerOfStatPercent(), InitDataForForm(), UpdateAllStats(), UpdateArmor(), and UpdateStats().

◆ UpdateBlockPercentage()

void Player::UpdateBlockPercentage ( )
617{
618 // No block
619 float value = 0.0f;
620 if (CanBlock())
621 {
622 // Base value
623 value = 5.0f;
624 // Modify value from defense skill
625 value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
626 // Increase from SPELL_AURA_MOD_BLOCK_PERCENT aura
628 // Increase from rating
630
631 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
632 {
633 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) : value;
634 }
635
636 value = value < 0.0f ? 0.0f : value;
637 }
639}
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
#define sConfigMgr
Definition: Config.h:74
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:790
bool CanBlock() const
Definition: Player.h:2195
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3639

References CanBlock(), CR_BLOCK, Unit::GetDefenseSkillValue(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), Unit::GetTotalAuraModifier(), PLAYER_BLOCK_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), and SPELL_AURA_MOD_BLOCK_PERCENT.

Referenced by AuraEffect::HandleAuraModBlockPercent(), SetCanBlock(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdateCharmedAI()

void Player::UpdateCharmedAI ( )
private
1955{
1956 // Xinef: maybe passed as argument?
1957 Unit* charmer = GetCharmer();
1958 CharmInfo* charmInfo = GetCharmInfo();
1959
1960 // Xinef: needs more thinking, maybe kill player?
1961 if (!charmer || !charmInfo)
1962 return;
1963
1964 // Xinef: we should be killed if caster enters evade mode and charm is
1965 // infinite
1966 if (charmer->IsCreature() &&
1967 charmer->ToCreature()->IsInEvadeMode())
1968 {
1969 AuraEffectList const& auras =
1971 for (AuraEffectList::const_iterator iter = auras.begin();
1972 iter != auras.end(); ++iter)
1973 if ((*iter)->GetCasterGUID() == charmer->GetGUID() &&
1974 (*iter)->GetBase()->IsPermanent())
1975 {
1976 Unit::DealDamage(charmer, this, GetHealth(), nullptr,
1978 nullptr, false);
1979 return;
1980 }
1981 }
1982
1983 Unit* target = GetVictim();
1984 if (target)
1985 {
1986 SetInFront(target);
1988 }
1989
1991 return;
1992
1993 bool Mages =
1994 getClassMask() & (1 << (CLASS_MAGE - 1) | 1 << (CLASS_WARLOCK - 1) |
1995 1 << (CLASS_DRUID - 1) | 1 << (CLASS_HUNTER - 1) |
1996 1 << (CLASS_PRIEST - 1));
1997
1998 // Xinef: charmer type specific actions
1999 if (charmer->IsPlayer())
2000 {
2001 bool follow = false;
2002 if (!target)
2003 {
2004 if (charmInfo->GetPlayerReactState() == REACT_PASSIVE)
2005 follow = true;
2006 else if (charmInfo->GetPlayerReactState() == REACT_DEFENSIVE)
2007 {
2008 if (charmer->GetVictim())
2009 target = charmer->GetVictim();
2010 else
2011 follow = true;
2012 }
2013
2014 if (follow)
2015 {
2019 return;
2020 }
2021 }
2022 else if (target &&
2025 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
2026 }
2027
2028 if (!target || !IsValidAttackTarget(target))
2029 {
2030 target = SelectNearbyTarget(nullptr, GetMap()->IsDungeon() ? 100.f : 30.f);
2031 if (!target)
2032 {
2036
2037 return;
2038 }
2039
2040 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
2041 Attack(target, true);
2042 }
2043 else
2044 {
2045 float Distance = GetDistance(target);
2046 uint8 rnd = urand(0, 1);
2047
2048 if (Mages)
2049 {
2050 if ((GetPower(POWER_MANA) * 100 / GetMaxPower(POWER_MANA)) < 10)
2051 {
2052 GetMotionMaster()->MoveChase(target, 4);
2053 return;
2054 }
2055
2056 if (Distance <= 3)
2057 {
2058 if (urand(0, 1))
2059 {
2062 CastSpell(target, m_charmAISpells[SPELL_T_STUN], false);
2067 false);
2068 else if (m_charmAISpells[SPELL_IMMUNITY] &&
2071 }
2072 else
2073 {
2074 switch (urand(0, 1))
2075 {
2076 case 0:
2080 CastSpell(
2081 target,
2083 false);
2084 break;
2085 case 1:
2090 false);
2091 break;
2092 }
2093 }
2094 }
2095 else
2096 {
2097 switch (urand(0, 2))
2098 {
2099 case 0:
2103 CastSpell(target,
2105 false);
2106 break;
2107 case 1:
2111 CastSpell(target,
2113 false);
2114 break;
2115 case 2:
2119 false);
2120 break;
2121 }
2122 }
2123 }
2124 else
2125 {
2126 if (Distance > 10)
2127 {
2128 GetMotionMaster()->MoveChase(target, 2.0f);
2131 CastSpell(target, m_charmAISpells[SPELL_T_CHARGE], false);
2132 else if (m_charmAISpells[SPELL_FAST_RUN] &&
2135 }
2136
2138 return;
2139
2140 switch (urand(0, 2))
2141 {
2142 case 0:
2146 CastSpell(target,
2148 false);
2149 break;
2150 case 1:
2155 false);
2156 break;
2157 case 2:
2161 break;
2162 }
2163 }
2164 }
2165}
#define PET_FOLLOW_ANGLE
Definition: PetDefines.h:203
#define PET_FOLLOW_DIST
Definition: PetDefines.h:202
@ REACT_DEFENSIVE
Definition: Unit.h:550
@ REACT_PASSIVE
Definition: Unit.h:549
@ UNIT_STATE_FOLLOW
Definition: UnitDefines.h:179
@ SPELL_HIGH_DAMAGE1
Definition: Player.h:925
@ CHASE_MOTION_TYPE
Definition: MotionMaster.h:45
bool IsInEvadeMode() const
Definition: Creature.h:135
ReactStates GetPlayerReactState() const
Definition: CharmInfo.h:184
Unit * SelectNearbyTarget(Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
Definition: Unit.cpp:17017
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10312
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16737
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13922
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20289
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:313
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:913
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:409

References Unit::Attack(), Unit::CastSpell(), CHASE_MOTION_TYPE, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PRIEST, CLASS_WARLOCK, Unit::DealDamage(), DIRECT_DAMAGE, Unit::GetAuraEffectsByType(), Unit::GetCharmer(), Unit::GetCharmInfo(), Unit::getClassMask(), MotionMaster::GetCurrentMovementGeneratorType(), WorldObject::GetDistance(), Object::GetGUID(), Unit::GetHealth(), WorldObject::GetMap(), Unit::GetMaxPower(), Unit::GetMotionMaster(), CharmInfo::GetPlayerReactState(), Unit::GetPower(), Unit::GetVictim(), HasSpellCooldown(), Unit::HasUnitState(), Object::IsCreature(), Creature::IsInEvadeMode(), Object::IsPlayer(), Unit::IsValidAttackTarget(), m_charmAISpells, MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_ANGLE, PET_FOLLOW_DIST, POWER_MANA, REACT_DEFENSIVE, REACT_PASSIVE, Unit::SelectNearbyTarget(), Unit::SendMovementFlagUpdate(), Unit::SetInFront(), SPELL_AURA_MOD_CHARM, SPELL_DOT_DAMAGE, SPELL_FAST_RUN, SPELL_HIGH_DAMAGE1, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_ROOT_OR_FEAR, SPELL_SCHOOL_MASK_NORMAL, SPELL_T_CHARGE, SPELL_T_STUN, Object::ToCreature(), UNIT_STATE_CASTING, UNIT_STATE_FOLLOW, and urand().

Referenced by Update().

◆ UpdateCombatSkills()

void Player::UpdateCombatSkills ( Unit victim,
WeaponAttackType  attType,
bool  defence,
Item item = nullptr 
)
1026{
1027 uint8 playerLevel = GetLevel();
1028 uint16 currentSkillValue = defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType);
1029 uint16 currentSkillMax = 5 * playerLevel;
1030 int32 skillDiff = currentSkillMax - currentSkillValue;
1031
1032 // Max skill reached for level.
1033 // Can in some cases be less than 0: having max skill and then .level -1 as example.
1034 if (skillDiff <= 0)
1035 {
1036 return;
1037 }
1038
1039 uint8 greylevel = Acore::XP::GetGrayLevel(playerLevel);
1040 uint8 moblevel = defence ? victim->getLevelForTarget(this) : victim->GetLevel(); // if defense than victim == attacker
1041 /*if (moblevel < greylevel)
1042 return;*/
1043 // Patch 3.0.8 (2009-01-20): You can no longer skill up weapons on mobs that are immune to damage.
1044
1045 if (moblevel > playerLevel + 5)
1046 {
1047 moblevel = playerLevel + 5;
1048 }
1049
1050 int16 lvldif = moblevel - greylevel;
1051 if (lvldif < 3)
1052 {
1053 lvldif = 3;
1054 }
1055
1056 float chance = float(3 * lvldif * skillDiff) / playerLevel;
1057 if (!defence)
1058 {
1059 chance += chance * 0.02f * GetStat(STAT_INTELLECT);
1060 }
1061
1062 chance = chance < 1.0f ? 1.0f : chance; // minimum chance to increase skill is 1%
1063
1064 LOG_DEBUG("entities.player", "Player::UpdateCombatSkills(defence:{}, playerLevel:{}, moblevel:{}) -> ({}/{}) chance to increase skill is {}%", defence, playerLevel, moblevel, currentSkillValue, currentSkillMax, chance);
1065
1066 if (roll_chance_f(chance))
1067 {
1068 if (defence)
1069 {
1070 UpdateDefense();
1071 }
1072 else
1073 {
1074 UpdateWeaponSkill(victim, attType, item);
1075 }
1076 }
1077}
uint32 GetBaseDefenseSkillValue() const
Definition: Player.h:1943
uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const
Definition: Player.cpp:12757
void UpdateDefense()
Definition: PlayerUpdates.cpp:603
void UpdateWeaponSkill(Unit *victim, WeaponAttackType attType, Item *item=nullptr)
Definition: PlayerUpdates.cpp:981
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:1025

References GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Unit::getLevelForTarget(), Unit::GetStat(), LOG_DEBUG, roll_chance_f(), STAT_INTELLECT, UpdateDefense(), and UpdateWeaponSkill().

Referenced by Unit::ProcDamageAndSpellFor().

◆ UpdateContestedPvP()

void Player::UpdateContestedPvP ( uint32  currTime)
361{
363 return;
364 if (m_contestedPvPTimer <= diff)
365 {
367 }
368 else
369 m_contestedPvPTimer -= diff;
370}

References Unit::IsInCombat(), m_contestedPvPTimer, and ResetContestedPvP().

Referenced by Update().

◆ UpdateCorpseReclaimDelay()

void Player::UpdateCorpseReclaimDelay ( )
1930{
1932
1933 if ((pvp &&
1935 (!pvp && !sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
1936 return;
1937
1938 time_t now = GameTime::GetGameTime().count();
1939
1940 if (now < m_deathExpireTime)
1941 {
1942 // full and partly periods 1..3
1943 uint64 count = (m_deathExpireTime - now) / DEATH_EXPIRE_STEP + 1;
1944
1945 if (count < MAX_DEATH_COUNT)
1946 m_deathExpireTime = now + (count + 1) * DEATH_EXPIRE_STEP;
1947 else
1949 }
1950 else
1952}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by KillPlayer().

◆ UpdateCraftSkill()

bool Player::UpdateCraftSkill ( uint32  spellid)
825{
826 LOG_DEBUG("entities.player.skills", "UpdateCraftSkill spellid {}", spellid);
827
828 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellid);
829
830 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first;
831 _spell_idx != bounds.second; ++_spell_idx)
832 {
833 if (_spell_idx->second->SkillLine)
834 {
835 uint32 SkillValue =
836 GetPureSkillValue(_spell_idx->second->SkillLine);
837
838 // Alchemy Discoveries here
839 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
840 if (spellInfo && spellInfo->Mechanic == MECHANIC_DISCOVERY)
841 {
842 if (uint32 discoveredSpell = GetSkillDiscoverySpell(
843 _spell_idx->second->SkillLine, spellid, this))
844 learnSpell(discoveredSpell);
845 }
846
847 uint32 craft_skill_gain =
848 sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING);
849 sScriptMgr->OnPlayerUpdateCraftingSkill(this, _spell_idx->second, SkillValue, craft_skill_gain);
850
851 return UpdateSkillPro(
852 _spell_idx->second->SkillLine,
853 SkillGainChance(SkillValue,
854 _spell_idx->second->TrivialSkillLineRankHigh,
855 (_spell_idx->second->TrivialSkillLineRankHigh +
856 _spell_idx->second->TrivialSkillLineRankLow) /
857 2,
858 _spell_idx->second->TrivialSkillLineRankLow),
859 craft_skill_gain);
860 }
861 }
862 return false;
863}
int SkillGainChance(uint32 SkillValue, uint32 GrayLevel, uint32 GreenLevel, uint32 YellowLevel)
Definition: PlayerUpdates.cpp:750
uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player *player)
Definition: SkillDiscovery.cpp:213
@ CONFIG_SKILL_GAIN_CRAFTING
Definition: IWorld.h:271
@ MECHANIC_DISCOVERY
Definition: SharedDefines.h:1353
bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
Definition: PlayerUpdates.cpp:913
uint32 Mechanic
Definition: SpellInfo.h:323

References CONFIG_SKILL_GAIN_CRAFTING, GetPureSkillValue(), GetSkillDiscoverySpell(), learnSpell(), LOG_DEBUG, SpellInfo::Mechanic, MECHANIC_DISCOVERY, SkillGainChance(), sScriptMgr, sSpellMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::DoCreateItem(), Spell::EffectEnchantItemPerm(), and spell_gen_profession_research::HandleScript().

◆ UpdateCritPercentage()

void Player::UpdateCritPercentage ( WeaponAttackType  attType)
642{
643 BaseModGroup modGroup;
644 uint16 index;
645 CombatRating cr;
646
647 switch (attType)
648 {
649 case OFF_ATTACK:
650 modGroup = OFFHAND_CRIT_PERCENTAGE;
652 cr = CR_CRIT_MELEE;
653 break;
654 case RANGED_ATTACK:
655 modGroup = RANGED_CRIT_PERCENTAGE;
657 cr = CR_CRIT_RANGED;
658 break;
659 case BASE_ATTACK:
660 default:
661 modGroup = CRIT_PERCENTAGE;
663 cr = CR_CRIT_MELEE;
664 break;
665 }
666
667 float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
668 // Modify crit from weapon skill and maximized defense skill of same level victim difference
669 value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f;
670
671 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
672 {
673 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) : value;
674 }
675
676 value = value < 0.0f ? 0.0f : value;
677 SetStatFloatValue(index, value);
678}
float GetTotalPercentageModValue(BaseModGroup modGroup) const
Definition: Player.h:2206
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3804

References BASE_ATTACK, CR_CRIT_MELEE, CR_CRIT_RANGED, CRIT_PERCENTAGE, GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetTotalPercentageModValue(), Unit::GetWeaponSkillValue(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, sConfigMgr, and Object::SetStatFloatValue().

Referenced by HandleBaseModValue(), UpdateAllCritPercentages(), and UpdateRating().

◆ UpdateDefense()

void Player::UpdateDefense ( )
604{
606 sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE)))
607 UpdateDefenseBonusesMod(); // update dependent from defense skill part
608}
@ CONFIG_SKILL_GAIN_DEFENSE
Definition: IWorld.h:272
bool UpdateSkill(uint32 skill_id, uint32 step)
Definition: PlayerUpdates.cpp:709

References CONFIG_SKILL_GAIN_DEFENSE, SKILL_DEFENSE, sWorld, UpdateDefenseBonusesMod(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateDefenseBonusesMod()

void Player::UpdateDefenseBonusesMod ( )

◆ UpdateDodgePercentage()

void Player::UpdateDodgePercentage ( )
782{
783 const float dodge_cap[MAX_CLASSES] =
784 {
785 88.129021f, // Warrior
786 88.129021f, // Paladin
787 145.560408f, // Hunter
788 145.560408f, // Rogue
789 150.375940f, // Priest
790 88.129021f, // DK
791 145.560408f, // Shaman
792 150.375940f, // Mage
793 150.375940f, // Warlock
794 0.0f, // ??
795 116.890707f // Druid
796 };
797
798 float diminishing = 0.0f, nondiminishing = 0.0f;
799 GetDodgeFromAgility(diminishing, nondiminishing);
800 // Modify value from defense skill (only bonus from defense rating diminishes)
801 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
802 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
803 // Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
805 // Dodge from rating
806 diminishing += GetRatingBonusValue(CR_DODGE);
807 // apply diminishing formula to diminishing dodge chance
808 uint32 pclass = getClass() - 1;
809 m_realDodge = nondiminishing + (diminishing * dodge_cap[pclass] / (diminishing + dodge_cap[pclass] * m_diminishing_k[pclass]));
810
811 m_realDodge = m_realDodge < 0.0f ? 0.0f : m_realDodge;
812 float value = std::max(diminishing + nondiminishing, 0.0f);
813
814 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
815 {
816 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) : value;
817 }
818
820}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
void GetDodgeFromAgility(float &diminishing, float &nondiminishing)
Definition: Player.cpp:5120

References CR_DEFENSE_SKILL, CR_DODGE, Unit::getClass(), GetDodgeFromAgility(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realDodge, MAX_CLASSES, PLAYER_DODGE_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_DODGE_PERCENT.

Referenced by AuraEffect::HandleAuraModDodgePercent(), UpdateDefenseBonusesMod(), UpdateRating(), and UpdateStats().

◆ UpdateDuelFlag()

void Player::UpdateDuelFlag ( time_t  currTime)
424{
425 if (duel && duel->State == DUEL_STATE_COUNTDOWN && duel->StartTime <= currTime)
426 {
427 sScriptMgr->OnPlayerDuelStart(this, duel->Opponent);
428
430 duel->Opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 2);
431
433 duel->Opponent->duel->State = DUEL_STATE_IN_PROGRESS;
434 }
435}
@ DUEL_STATE_COUNTDOWN
Definition: Player.h:377
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:378

References duel, DUEL_STATE_COUNTDOWN, DUEL_STATE_IN_PROGRESS, PLAYER_DUEL_TEAM, Unit::SetUInt32Value(), and sScriptMgr.

Referenced by Update().

◆ UpdateEnchantmentDurations()

void Player::UpdateEnchantmentDurations ( )
4735{
4736 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4737 {
4738 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4739 }
4740}

References m_enchantDuration.

Referenced by Spell::EffectSummonChangeItem().

◆ UpdateEnchantTime()

void Player::UpdateEnchantTime ( uint32  time)
4163{
4164 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4165 {
4166 ASSERT(itr->item);
4167 next = itr;
4168 if (!itr->item->GetEnchantmentId(itr->slot))
4169 {
4170 next = m_enchantDuration.erase(itr);
4171 }
4172 else if (itr->leftduration <= time)
4173 {
4174 ApplyEnchantment(itr->item, itr->slot, false, false);
4175 itr->item->ClearEnchantment(itr->slot);
4176 next = m_enchantDuration.erase(itr);
4177 }
4178 else if (itr->leftduration > time)
4179 {
4180 itr->leftduration -= time;
4181 ++next;
4182 }
4183 }
4184}

References ApplyEnchantment(), ASSERT, and m_enchantDuration.

Referenced by Update().

◆ UpdateEnergyRegen()

◆ UpdateEquipSpellsAtFormChange()

void Player::UpdateEquipSpellsAtFormChange ( )
1360{
1361 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
1362 {
1363 if (m_items[i] && !m_items[i]->IsBroken() &&
1365 {
1366 ApplyItemEquipSpell(m_items[i], false,
1367 true); // remove spells that not fit to form
1369 m_items[i], true,
1370 true); // add spells that fit form but not active
1371 }
1372 }
1373
1374 // item set bonuses not dependent from item broken state
1375 for (std::size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex)
1376 {
1377 ItemSetEffect* eff = ItemSetEff[setindex];
1378 if (!eff)
1379 continue;
1380
1381 for (uint32 y = 0; y < MAX_ITEM_SET_SPELLS; ++y)
1382 {
1383 SpellInfo const* spellInfo = eff->spells[y];
1384 if (!spellInfo)
1385 continue;
1386
1387 ApplyEquipSpell(spellInfo, nullptr, false,
1388 true); // remove spells that not fit to form
1389 if (!sScriptMgr->OnPlayerCanApplyEquipSpellsItemSet(this, eff))
1390 break;
1391 ApplyEquipSpell(spellInfo, nullptr, true,
1392 true); // add spells that fit form but not active
1393 }
1394 }
1395}
#define MAX_ITEM_SET_SPELLS
Definition: DBCStructure.h:1230
Definition: Item.h:32
SpellInfo const * spells[8]
Definition: Item.h:35

References ApplyEquipSpell(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), GetAttackBySlot(), INVENTORY_SLOT_BAG_END, ItemSetEff, m_items, MAX_ITEM_SET_SPELLS, ItemSetEffect::spells, and sScriptMgr.

Referenced by InitDataForForm().

◆ UpdateExpertise()

void Player::UpdateExpertise ( WeaponAttackType  attType)
878{
879 if (attack == RANGED_ATTACK)
880 return;
881
882 float expertise = GetRatingBonusValue(CR_EXPERTISE);
883
884 Item* weapon = GetWeaponForAttack(attack, true);
885
887 for (AuraEffectList::const_iterator itr = expAuras.begin(); itr != expAuras.end(); ++itr)
888 {
889 // item neutral spell
890 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
891 expertise += (*itr)->GetAmount();
892 // item dependent spell
893 else if (weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellInfo()))
894 expertise += (*itr)->GetAmount();
895 }
896
897 if (expertise < 0)
898 expertise = 0;
899
900 switch (attack)
901 {
902 case BASE_ATTACK:
903 m_Expertise = expertise;
905 break;
906 case OFF_ATTACK:
907 m_OffhandExpertise = expertise;
909 break;
910 default:
911 break;
912 }
913}
@ PLAYER_EXPERTISE
Definition: UpdateFields.h:349
@ PLAYER_OFFHAND_EXPERTISE
Definition: UpdateFields.h:350
@ SPELL_AURA_MOD_EXPERTISE
Definition: SpellAuraDefines.h:303

References BASE_ATTACK, CR_EXPERTISE, Unit::GetAuraEffectsByType(), GetRatingBonusValue(), GetWeaponForAttack(), Item::IsFitToSpellRequirements(), m_Expertise, m_OffhandExpertise, OFF_ATTACK, PLAYER_EXPERTISE, PLAYER_OFFHAND_EXPERTISE, RANGED_ATTACK, Unit::SetUInt32Value(), and SPELL_AURA_MOD_EXPERTISE.

Referenced by DestroyItem(), EquipItem(), AuraEffect::HandleAuraModExpertise(), RemoveItem(), UpdateAllStats(), and UpdateRating().

◆ UpdateFallInformationIfNeed()

void Player::UpdateFallInformationIfNeed ( MovementInfo const &  minfo,
uint16  opcode 
)
2188{
2189 if (m_lastFallTime >= minfo.fallTime ||
2190 m_lastFallZ <= minfo.pos.GetPositionZ() || opcode == MSG_MOVE_FALL_LAND)
2191 SetFallInformation(minfo.fallTime, minfo.pos.GetPositionZ());
2192}
@ MSG_MOVE_FALL_LAND
Definition: Opcodes.h:231

References MovementInfo::fallTime, Position::GetPositionZ(), m_lastFallTime, m_lastFallZ, MSG_MOVE_FALL_LAND, MovementInfo::pos, and SetFallInformation().

Referenced by WorldSession::HandleMovementOpcodes().

◆ UpdateFFAPvPFlag()

void Player::UpdateFFAPvPFlag ( time_t  currTime)
392{
393 if (!IsFFAPvP() || sWorld->IsFFAPvPRealm() || !pvpInfo.FFAPvPEndTimer || currTime < pvpInfo.FFAPvPEndTimer + 30)
394 {
395 return;
396 }
397
398 pvpInfo.FFAPvPEndTimer = time_t(0);
400 {
402 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
403 }
404 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
405 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
406
407 // xinef: iterate attackers
408 AttackerSet toRemove;
409 AttackerSet const& attackers = getAttackers();
410 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end(); ++itr)
411 if (!(*itr)->IsValidAttackTarget(this))
412 toRemove.insert(*itr);
413
414 for (AttackerSet::const_iterator itr = toRemove.begin(); itr != toRemove.end(); ++itr)
415 (*itr)->AttackStop();
416
417 // xinef: remove our own victim
418 if (Unit* victim = GetVictim())
419 if (!IsValidAttackTarget(victim))
420 AttackStop();
421}
time_t FFAPvPEndTimer
‍Time when player unflags himself for PvP (flag removed after 5 minutes)
Definition: Player.h:371
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:622
AttackerSet const & getAttackers() const
Definition: Unit.h:843

References Unit::AttackStop(), PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by Update().

◆ UpdateFFAPvPState()

void Player::UpdateFFAPvPState ( bool  reset = true)
Todo:
: should we always synchronize UNIT_FIELD_BYTES_2, 1 of controller
1458{
1460 // and controlled? no, we shouldn't, those are checked for affecting player
1461 // by client
1462 if (!pvpInfo.IsInNoPvPArea && !IsGameMaster() &&
1463 (pvpInfo.IsInFFAPvPArea || sWorld->IsFFAPvPRealm()))
1464 {
1465 if (!IsFFAPvP())
1466 {
1467 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, true);
1469 for (ControlSet::iterator itr = m_Controlled.begin();
1470 itr != m_Controlled.end(); ++itr)
1471 (*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1,
1473 }
1474
1476 {
1477 pvpInfo.FFAPvPEndTimer = time_t(0);
1478 }
1479 }
1480 else if (IsFFAPvP())
1481 {
1482 if ((pvpInfo.IsInNoPvPArea || IsGameMaster()) || reset ||
1484 {
1485 pvpInfo.FFAPvPEndTimer = time_t(0);
1487 {
1489 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
1490 }
1491 for (ControlSet::iterator itr = m_Controlled.begin();
1492 itr != m_Controlled.end(); ++itr)
1493 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1,
1495
1496 // xinef: iterate attackers
1497 AttackerSet toRemove;
1498 AttackerSet const& attackers = getAttackers();
1499 for (AttackerSet::const_iterator itr = attackers.begin();
1500 itr != attackers.end(); ++itr)
1501 if (!(*itr)->IsValidAttackTarget(this))
1502 toRemove.insert(*itr);
1503
1504 for (AttackerSet::const_iterator itr = toRemove.begin();
1505 itr != toRemove.end(); ++itr)
1506 (*itr)->AttackStop();
1507
1508 // xinef: remove our own victim
1509 if (Unit* victim = GetVictim())
1510 if (!IsValidAttackTarget(victim))
1511 AttackStop();
1512 }
1513 else
1514 {
1515 // Not in FFA PvP Area
1516 // Not FFA PvP realm
1517 // Not FFA PvP timer already set
1518 // Being recently in PvP combat
1519 if (!pvpInfo.IsInFFAPvPArea && !sWorld->IsFFAPvPRealm() &&
1521 {
1523 GameTime::GetGameTime().count() +
1524 sWorld->getIntConfig(CONFIG_FFA_PVP_TIMER);
1525 }
1526 }
1527 }
1528}
@ CONFIG_FFA_PVP_TIMER
Definition: IWorld.h:418
time_t EndTimer
‍Marks if player is in an FFAPvP area (such as Gurubashi Arena)
Definition: Player.h:370

References Unit::AttackStop(), CONFIG_FFA_PVP_TIMER, PvPInfo::EndTimer, PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), GameTime::GetGameTime(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), IsGameMaster(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), Object::SetByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by UpdateArea(), and UpdatePvPState().

◆ UpdateFishingSkill()

bool Player::UpdateFishingSkill ( )
887{
888 LOG_DEBUG("entities.player.skills", "UpdateFishingSkill");
889
891
892 if (SkillValue >= GetMaxSkillValue(SKILL_FISHING))
893 {
894 return false;
895 }
896
897 /* Whenever the player clicks on the fishing gameobject the
898 * core will decide based on a probability if the skill raises or not.
899 */
900 return UpdateSkillPro(
902 static_cast<int32>(getProbabilityOfLevelUp(SkillValue)) * 10,
903 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING));
904}
float getProbabilityOfLevelUp(uint32 SkillValue)
Definition: PlayerUpdates.cpp:865
@ CONFIG_SKILL_GAIN_GATHERING
Definition: IWorld.h:273
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5475

References CONFIG_SKILL_GAIN_GATHERING, GetMaxSkillValue(), getProbabilityOfLevelUp(), GetPureSkillValue(), LOG_DEBUG, SKILL_FISHING, sWorld, and UpdateSkillPro().

Referenced by GameObject::Use().

◆ UpdateForQuestWorldObjects()

void Player::UpdateForQuestWorldObjects ( )

This code doesn't look right, but it was logically converted to condition system to do the exact same thing it did before. It definitely needs to be overlooked for intended functionality.

1793{
1794 if (m_clientGUIDs.empty())
1795 return;
1796
1797 UpdateData udata;
1798 WorldPacket packet;
1799 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
1800 {
1801 if ((*itr).IsGameObject())
1802 {
1803 if (GameObject* obj = ObjectAccessor::GetGameObject(*this, *itr))
1804 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1805 }
1806 else if ((*itr).IsCreatureOrVehicle())
1807 {
1809 if (!obj)
1810 continue;
1811
1812 // check if this unit requires quest specific flags
1814 {
1815 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(obj->GetEntry());
1816 for (SpellClickInfoContainer::const_iterator _itr = clickPair.first; _itr != clickPair.second; ++_itr)
1817 {
1820 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(obj->GetEntry(), _itr->second.spellId);
1821 bool buildUpdateBlock = false;
1822 for (ConditionList::const_iterator jtr = conds.begin(); jtr != conds.end() && !buildUpdateBlock; ++jtr)
1823 if ((*jtr)->ConditionType == CONDITION_QUESTREWARDED || (*jtr)->ConditionType == CONDITION_QUESTTAKEN)
1824 buildUpdateBlock = true;
1825
1826 if (buildUpdateBlock)
1827 {
1828 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1829 break;
1830 }
1831 }
1832 }
1834 {
1835 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1836 }
1837 }
1838 }
1839
1840 udata.BuildPacket(packet);
1841 GetSession()->SendPacket(&packet);
1842}
@ UNIT_NPC_FLAG_VENDOR_MASK
Definition: UnitDefines.h:343
@ CONDITION_QUESTREWARDED
Definition: ConditionMgr.h:42
@ CONDITION_QUESTTAKEN
Definition: ConditionMgr.h:43
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:184
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:257
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition: UpdateData.cpp:48

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), CONDITION_QUESTREWARDED, CONDITION_QUESTTAKEN, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), ObjectAccessor::GetGameObject(), GetSession(), Unit::HasNpcFlag(), m_clientGUIDs, sConditionMgr, WorldSession::SendPacket(), sObjectMgr, UNIT_NPC_FLAG_SPELLCLICK, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_VENDOR_MASK.

Referenced by Group::AddMember(), Group::Disband(), EquipItem(), ItemAddedQuestCheck(), ItemRemovedQuestCheck(), Group::RemoveMember(), and SendQuestUpdate().

◆ UpdateGatherSkill()

bool Player::UpdateGatherSkill ( uint32  SkillId,
uint32  SkillValue,
uint32  RedLevel,
uint32  Multiplicator = 1 
)
764{
765 LOG_DEBUG("entities.player.skills",
766 "UpdateGatherSkill(SkillId {} SkillLevel {} RedLevel {})",
767 SkillId, SkillValue, RedLevel);
768
769 uint32 gathering_skill_gain =
770 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING);
771 sScriptMgr->OnPlayerUpdateGatheringSkill(this, SkillId, SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25, gathering_skill_gain);
772
773 // For skinning and Mining chance decrease with level. 1-74 - no decrease,
774 // 75-149 - 2 times, 225-299 - 8 times
775 switch (SkillId)
776 {
777 case SKILL_HERBALISM:
781 return UpdateSkillPro(SkillId,
782 SkillGainChance(SkillValue, RedLevel + 100,
783 RedLevel + 50, RedLevel + 25) *
784 Multiplicator,
785 gathering_skill_gain);
786 case SKILL_SKINNING:
787 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
788 return UpdateSkillPro(SkillId,
789 SkillGainChance(SkillValue, RedLevel + 100,
790 RedLevel + 50,
791 RedLevel + 25) *
792 Multiplicator,
793 gathering_skill_gain);
794 else
795 return UpdateSkillPro(
796 SkillId,
797 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
798 RedLevel + 25) *
799 Multiplicator) >>
800 (SkillValue /
802 gathering_skill_gain);
803 case SKILL_MINING:
804 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
805 return UpdateSkillPro(SkillId,
806 SkillGainChance(SkillValue, RedLevel + 100,
807 RedLevel + 50,
808 RedLevel + 25) *
809 Multiplicator,
810 gathering_skill_gain);
811 else
812 return UpdateSkillPro(
813 SkillId,
814 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
815 RedLevel + 25) *
816 Multiplicator) >>
817 (SkillValue /
819 gathering_skill_gain);
820 }
821 return false;
822}
@ CONFIG_SKILL_CHANCE_SKINNING_STEPS
Definition: IWorld.h:270
@ CONFIG_SKILL_CHANCE_MINING_STEPS
Definition: IWorld.h:269
@ SKILL_INSCRIPTION
Definition: SharedDefines.h:3002
@ SKILL_MINING
Definition: SharedDefines.h:2919
@ SKILL_SKINNING
Definition: SharedDefines.h:2961
@ SKILL_JEWELCRAFTING
Definition: SharedDefines.h:2985
@ SKILL_HERBALISM
Definition: SharedDefines.h:2915

References CONFIG_SKILL_CHANCE_MINING_STEPS, CONFIG_SKILL_CHANCE_SKINNING_STEPS, CONFIG_SKILL_GAIN_GATHERING, LOG_DEBUG, SKILL_HERBALISM, SKILL_INSCRIPTION, SKILL_JEWELCRAFTING, SKILL_LOCKPICKING, SKILL_MINING, SKILL_SKINNING, SkillGainChance(), sScriptMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::EffectMilling(), Spell::EffectOpenLock(), Spell::EffectProspecting(), Spell::EffectSkinning(), and GetExplicitDiscoverySpell().

◆ UpdateHomebindTime()

void Player::UpdateHomebindTime ( uint32  time)
1398{
1399 // GMs never get homebind timer online
1401 {
1402 if (m_HomebindTimer) // instance valid, but timer not reset
1403 {
1404 // hide reminder
1405 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1406 data << uint32(0);
1407 data << uint32(0);
1408 GetSession()->SendPacket(&data);
1409 }
1410 // instance is valid, reset homebind timer
1411 m_HomebindTimer = 0;
1412 }
1413 else if (m_HomebindTimer > 0)
1414 {
1415 if (time >= m_HomebindTimer)
1416 {
1417 // teleport to nearest graveyard
1419 }
1420 else
1421 m_HomebindTimer -= time;
1422 }
1423 else
1424 {
1425 // instance is invalid, start homebind timer
1426 m_HomebindTimer = 60000;
1427 // send message to player
1428 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1429 data << uint32(m_HomebindTimer);
1430 data << uint32(1);
1431 GetSession()->SendPacket(&data);
1432 LOG_DEBUG(
1433 "maps",
1434 "PLAYER: Player '{}' ({}) will be teleported to homebind in 60 "
1435 "seconds",
1436 GetName(), GetGUID().ToString());
1437 }
1438}
@ SMSG_RAID_GROUP_ONLY
Definition: Opcodes.h:676

References Object::GetGUID(), WorldObject::GetName(), GetSession(), IsGameMaster(), LOG_DEBUG, m_HomebindTimer, m_InstanceValid, RepopAtGraveyard(), WorldSession::SendPacket(), SMSG_RAID_GROUP_ONLY, and Position::ToString().

Referenced by Update().

◆ UpdateHonorFields()

void Player::UpdateHonorFields ( )

called when rewarding honor and at each save

1183{
1185 time_t now = time_t(GameTime::GetGameTime().count());
1186 time_t today = time_t(GameTime::GetGameTime().count() / DAY) * DAY;
1187
1188 if (m_lastHonorUpdateTime < today)
1189 {
1190 time_t yesterday = today - DAY;
1191
1193
1194 // update yesterday's contribution
1195 if (m_lastHonorUpdateTime >= yesterday)
1196 {
1199
1200 // this is the first update today, reset today's contribution
1203 }
1204 else
1205 {
1206 // no honor/kills yesterday or today, reset
1209 }
1210 }
1211
1213}
uint16 PAIR32_LOPART(uint32 x)
Definition: ObjectDefines.h:97

References DAY, GameTime::GetGameTime(), Object::GetUInt32Value(), m_lastHonorUpdateTime, MAKE_PAIR32(), PAIR32_LOPART(), PLAYER_FIELD_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, and Unit::SetUInt32Value().

Referenced by honor_commandscript::HandleHonorUpdateCommand(), LoadFromDB(), RewardHonor(), and SaveToDB().

◆ UpdateInvisibilityDrunkDetect()

void Player::UpdateInvisibilityDrunkDetect ( )
1003{
1004 // select drunk percent or total SPELL_AURA_MOD_FAKE_INEBRIATE amount, whichever is higher for visibility updates
1005 uint8 drunkValue = GetDrunkValue();
1006 int32 fakeDrunkValue = GetFakeDrunkValue();
1007 int32 maxDrunkValue = std::max<int32>(drunkValue, fakeDrunkValue);
1008
1009 if (maxDrunkValue != 0)
1010 {
1013 }
1014 else
1016
1018}
@ INVISIBILITY_DRUNK
Definition: SharedDefines.h:1261
void AddFlag(FLAG_TYPE flag)
Definition: Object.h:374
void DelFlag(FLAG_TYPE flag)
Definition: Object.h:375
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES > m_invisibilityDetect
Definition: Object.h:527
int32 GetFakeDrunkValue() const
Definition: Player.h:2182

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::AddFlag(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::DelFlag(), GetDrunkValue(), GetFakeDrunkValue(), INVISIBILITY_DRUNK, WorldObject::m_invisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by AuraEffect::HandleAuraModFakeInebriation(), and SetDrunkValue().

◆ UpdateItemDuration()

void Player::UpdateItemDuration ( uint32  time,
bool  realtimeonly = false 
)
4146{
4147 if (m_itemDuration.empty())
4148 return;
4149
4150 LOG_DEBUG("entities.player.items", "Player::UpdateItemDuration({}, {})", time, realtimeonly);
4151
4152 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end();)
4153 {
4154 Item* item = *itr;
4155 ++itr; // current element can be erased in UpdateDuration
4156
4157 if (!realtimeonly || item->GetTemplate()->HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME))
4158 item->UpdateDuration(this, time);
4159 }
4160}
@ ITEM_FLAGS_CU_DURATION_REAL_TIME
Definition: ItemTemplate.h:219
void UpdateDuration(Player *owner, uint32 diff)
Definition: Item.cpp:318
bool HasFlagCu(ItemFlagsCustom flag) const
Definition: ItemTemplate.h:829

References Item::GetTemplate(), ItemTemplate::HasFlagCu(), ITEM_FLAGS_CU_DURATION_REAL_TIME, LOG_DEBUG, m_itemDuration, and Item::UpdateDuration().

Referenced by LoadFromDB(), and Update().

◆ UpdateLFGChannel()

void Player::UpdateLFGChannel ( )
465{
466 if (!sWorld->getBoolConfig(CONFIG_RESTRICTED_LFG_CHANNEL))
467 return;
468
470 if (!cMgr)
471 return;
472
473 ChatChannelsEntry const* cce = sChatChannelsStore.LookupEntry(26); /*LookingForGroup*/
475 if (!cLFG)
476 return;
477
478 Channel* cUsed = nullptr;
479 for (Channel* channel : m_channels)
480 if (channel && channel->GetChannelId() == cce->ChannelID)
481 {
482 cUsed = cLFG;
483 break;
484 }
485
486 if (IsUsingLfg())
487 {
488 if (cUsed == cLFG)
489 return;
490
491 cLFG->JoinChannel(this, "");
492 }
493 else
494 {
495 if (cLFG != cUsed)
496 return;
497
498 cLFG->LeaveChannel(this, true);
499 }
500}
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
@ CONFIG_RESTRICTED_LFG_CHANNEL
Definition: IWorld.h:96
void JoinChannel(Player *player, std::string const &pass)
Definition: Channel.cpp:157
Definition: ChannelMgr.h:29
static ChannelMgr * forTeam(TeamId teamId)
Definition: ChannelMgr.cpp:33
Channel * GetJoinChannel(std::string const &name, uint32 channel_id)
Definition: ChannelMgr.cpp:121
bool IsUsingLfg()
Definition: Player.cpp:13013
LocaleConstant GetSessionDbcLocale() const
Definition: WorldSession.h:511
Definition: DBCStructure.h:643
uint32 ChannelID
Definition: DBCStructure.h:644
char const * pattern[16]
Definition: DBCStructure.h:646

References ChatChannelsEntry::ChannelID, CONFIG_RESTRICTED_LFG_CHANNEL, ChannelMgr::forTeam(), ChannelMgr::GetJoinChannel(), WorldSession::GetSessionDbcLocale(), GetTeamId(), IsUsingLfg(), Channel::JoinChannel(), Channel::LeaveChannel(), m_channels, m_session, ChatChannelsEntry::pattern, sChatChannelsStore, and sWorld.

Referenced by WorldSession::HandleLfgJoinOpcode(), and WorldSession::HandleLfgLeaveOpcode().

◆ UpdateLocalChannels()

void Player::UpdateLocalChannels ( uint32  newZone)
503{
504 // pussywizard: mutex needed (tc changed opcode to THREAD UNSAFE)
505 static std::mutex channelsLock;
506 std::lock_guard<std::mutex> guard(channelsLock);
507
508 if (GetSession()->PlayerLoading() && !IsBeingTeleportedFar())
509 return; // The client handles it automatically after loading, but not
510 // after teleporting
511
512 AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(newZone);
513 if (!current_zone)
514 return;
515
517 if (!cMgr)
518 return;
519
520 std::string current_zone_name =
521 current_zone->area_name[GetSession()->GetSessionDbcLocale()];
522
523 for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i)
524 {
525 if (ChatChannelsEntry const* channel =
526 sChatChannelsStore.LookupEntry(i))
527 {
528 Channel* usedChannel = nullptr;
529
530 for (Channel* channel : m_channels)
531 {
532 if (channel && channel->GetChannelId() == i)
533 {
534 usedChannel = channel;
535 break;
536 }
537 }
538
539 Channel* removeChannel = nullptr;
540 Channel* joinChannel = nullptr;
541 bool sendRemove = true;
542
543 if (CanJoinConstantChannelInZone(channel, current_zone))
544 {
545 if (!(channel->flags & CHANNEL_DBC_FLAG_GLOBAL))
546 {
547 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY &&
548 usedChannel)
549 continue; // Already on the channel, as city channel
550 // names are not changing
551
552 char new_channel_name_buf[100];
553 std::string currentNameExt;
554
555 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY)
556 currentNameExt = sObjectMgr->GetAcoreStringForDBCLocale(LANG_CHANNEL_CITY);
557 else
558 currentNameExt = current_zone_name;
559
560 snprintf(new_channel_name_buf, 100,
561 channel->pattern[m_session->GetSessionDbcLocale()],
562 currentNameExt.c_str());
563
564 joinChannel = cMgr->GetJoinChannel(new_channel_name_buf,
565 channel->ChannelID);
566 if (usedChannel)
567 {
568 if (joinChannel != usedChannel)
569 {
570 removeChannel = usedChannel;
571 sendRemove = false; // Do not send leave channel, it
572 // already replaced at client
573 }
574 else
575 joinChannel = nullptr;
576 }
577 }
578 else
579 joinChannel = cMgr->GetJoinChannel(
580 channel->pattern[m_session->GetSessionDbcLocale()],
581 channel->ChannelID);
582 }
583 else
584 removeChannel = usedChannel;
585
586 if (joinChannel)
587 joinChannel->JoinChannel(
588 this, ""); // Changed Channel: ... or Joined Channel: ...
589
590 if (removeChannel)
591 {
592 removeChannel->LeaveChannel(this,
593 sendRemove); // Leave old channel
594 std::string name =
595 removeChannel
596 ->GetName(); // Store name, (*i)erase in LeftChannel
597 LeftChannel(removeChannel); // Remove from player's channel list
598 }
599 }
600 }
601}
@ LANG_CHANNEL_CITY
Definition: Language.h:759
@ CHANNEL_DBC_FLAG_GLOBAL
Definition: Channel.h:95
std::string const & GetName() const
Definition: Channel.h:179
void LeftChannel(Channel *c)
Definition: Player.cpp:5005
bool CanJoinConstantChannelInZone(ChatChannelsEntry const *channel, AreaTableEntry const *zone)
Definition: Player.cpp:4982
char const * area_name[16]
Definition: DBCStructure.h:527

References AreaTableEntry::area_name, CanJoinConstantChannelInZone(), CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GLOBAL, ChannelMgr::forTeam(), ChannelMgr::GetJoinChannel(), Channel::GetName(), GetSession(), WorldSession::GetSessionDbcLocale(), GetTeamId(), IsBeingTeleportedFar(), Channel::JoinChannel(), LANG_CHANNEL_CITY, Channel::LeaveChannel(), LeftChannel(), m_channels, m_session, sAreaTableStore, sChatChannelsStore, and sObjectMgr.

Referenced by UpdateZone().

◆ UpdateLootAchievements()

void Player::UpdateLootAchievements ( LootItem item,
Loot loot 
)

◆ UpdateManaRegen()

void Player::UpdateManaRegen ( )
927{
929 {
932 return;
933 }
934
935 float Intellect = GetStat(STAT_INTELLECT);
936 // Mana regen from spirit and intellect
937 float power_regen = std::sqrt(Intellect) * OCTRegenMPPerSpirit();
938 // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen
940
941 // Mana regen from SPELL_AURA_MOD_POWER_REGEN aura
943
944 // Get bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura
946 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
947 {
948 power_regen_mp5 += GetStat(Stats((*i)->GetMiscValue())) * (*i)->GetAmount() / 500.0f;
949 }
950
951 // Set regen rate in cast state apply only on spirit based regen
953 if (modManaRegenInterrupt > 100)
954 modManaRegenInterrupt = 100;
955 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + AsUnderlyingType(POWER_MANA), power_regen_mp5 + CalculatePct(power_regen, modManaRegenInterrupt));
956
958}
@ SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
Definition: SpellAuraDefines.h:197
@ SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
Definition: SpellAuraDefines.h:282
float OCTRegenMPPerSpirit()
Definition: Player.cpp:5248

References AsUnderlyingType(), CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetStat(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), Unit::GetTotalAuraMultiplierByMiscValue(), Unit::HasAuraTypeWithMiscvalue(), m_baseManaRegen, OCTRegenMPPerSpirit(), POWER_MANA, Object::SetStatFloatValue(), SPELL_AURA_MOD_MANA_REGEN_FROM_STAT, SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, STAT_INTELLECT, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, and UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER.

Referenced by ApplyManaRegenBonus(), AuraEffect::HandleModManaRegen(), AuraEffect::HandleModPowerRegen(), UpdateAllStats(), and UpdateStats().

◆ UpdateMaxHealth()

void Player::UpdateMaxHealth ( )
overridevirtual

Implements Unit.

297{
298 UnitMods unitMod = UNIT_MOD_HEALTH;
299
300 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreateHealth();
301 value *= GetModifierValue(unitMod, BASE_PCT);
303 value *= GetModifierValue(unitMod, TOTAL_PCT);
304
305 sScriptMgr->OnPlayerAfterUpdateMaxHealth(this, value);
306 SetMaxHealth((uint32)value);
307}
float GetHealthBonusFromStamina()
Definition: StatSystem.cpp:276

References BASE_PCT, BASE_VALUE, Unit::GetCreateHealth(), GetHealthBonusFromStamina(), Unit::GetModifierValue(), Unit::SetMaxHealth(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_HEALTH.

Referenced by UpdateAllStats(), and UpdateStats().

◆ UpdateMaxPower()

void Player::UpdateMaxPower ( Powers  power)
overridevirtual

Implements Unit.

310{
311 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_POWER_START) + power);
312
313 float bonusPower = (power == POWER_MANA && GetCreatePowers(power) > 0) ? GetManaBonusFromIntellect() : 0;
314
315 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power);
316 value *= GetModifierValue(unitMod, BASE_PCT);
317 value += GetModifierValue(unitMod, TOTAL_VALUE) + bonusPower;
318 value *= GetModifierValue(unitMod, TOTAL_PCT);
319
320 sScriptMgr->OnPlayerAfterUpdateMaxPower(this, power, value);
321 SetMaxPower(power, uint32(value));
322}
@ UNIT_MOD_POWER_START
Definition: Unit.h:175
float GetManaBonusFromIntellect()
Definition: StatSystem.cpp:286

References BASE_PCT, BASE_VALUE, Unit::GetCreatePowers(), GetManaBonusFromIntellect(), Unit::GetModifierValue(), POWER_MANA, Unit::SetMaxPower(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_POWER_START.

Referenced by Create(), UpdateAllStats(), and UpdateStats().

◆ UpdateMeleeHitChances()

void Player::UpdateMeleeHitChances ( )

◆ UpdateMirrorTimers()

void Player::UpdateMirrorTimers ( )
430{
431 // Desync flags for update on next HandleDrowning
433 m_MirrorTimerFlagsLast = ~m_MirrorTimerFlags;
434}

References m_MirrorTimerFlags, and m_MirrorTimerFlagsLast.

Referenced by AuraEffect::HandleWaterBreathing().

◆ UpdateNextMailTimeAndUnreads()

void Player::UpdateNextMailTimeAndUnreads ( )
437{
438 // Update the next delivery time and unread mails
439 time_t cTime = GameTime::GetGameTime().count();
440
442 unReadMails = 0;
443
444 for (Mail const* mail : GetMails())
445 {
446 if (mail->deliver_time > cTime)
447 {
448 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > mail->deliver_time)
449 m_nextMailDelivereTime = mail->deliver_time;
450 }
451
452 // must be not checked yet
453 if (mail->checked & MAIL_CHECK_MASK_READ)
454 continue;
455
456 // and already delivered or expired
457 if (cTime < mail->deliver_time || cTime > mail->expire_time)
458 continue;
459
460 unReadMails++;
461 }
462}
@ MAIL_CHECK_MASK_READ
Definition: Mail.h:47
PlayerMails const & GetMails() const
Definition: Player.h:1661

References GameTime::GetGameTime(), GetMails(), m_nextMailDelivereTime, MAIL_CHECK_MASK_READ, and unReadMails.

Referenced by _LoadMail(), and WorldSession::HandleGetMailList().

◆ UpdateObjectVisibility()

void Player::UpdateObjectVisibility ( bool  forced = true,
bool  fromUpdate = false 
)
overridevirtual

Reimplemented from WorldObject.

1618{
1619 // Prevent updating visibility if player is not in world (example: LoadFromDB sets drunkstate which updates invisibility while player is not in map)
1620 if (!IsInWorld())
1621 return;
1622
1623 if (!forced)
1625 else if (!isBeingLoaded())
1626 {
1627 if (!fromUpdate) // pussywizard:
1628 {
1630 return;
1631 }
1634 }
1635}
void AddToNotify(uint16 f)
Definition: Object.cpp:2989
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19163

References WorldObject::AddToNotify(), Unit::bRequestForcedVisibilityUpdate, isBeingLoaded(), Object::IsInWorld(), NOTIFY_VISIBILITY_CHANGED, Unit::UpdateObjectVisibility(), and UpdateVisibilityForPlayer().

Referenced by Map::AddPlayerToMap(), gm_commandscript::HandleGMVisibleCommand(), WorldSession::HandlePlayerLoginToCharInWorld(), Map::PlayerRelocation(), ResurrectPlayer(), SetGameMaster(), SetGroup(), Update(), and UpdateInvisibilityDrunkDetect().

◆ UpdateParryPercentage()

void Player::UpdateParryPercentage ( )
736{
737 const float parry_cap[MAX_CLASSES] =
738 {
739 47.003525f, // Warrior
740 47.003525f, // Paladin
741 145.560408f, // Hunter
742 145.560408f, // Rogue
743 0.0f, // Priest
744 47.003525f, // DK
745 145.560408f, // Shaman
746 0.0f, // Mage
747 0.0f, // Warlock
748 0.0f, // ??
749 0.0f // Druid
750 };
751
752 // No parry
753 float value = 0.0f;
754 m_realParry = 0.0f;
755 uint32 pclass = getClass() - 1;
756 if (CanParry() && parry_cap[pclass] > 0.0f)
757 {
758 float nondiminishing = 5.0f;
759 // Parry from rating
760 float diminishing = GetRatingBonusValue(CR_PARRY);
761 // Modify value from defense skill (only bonus from defense rating diminishes)
762 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
763 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
764 // Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
766 // apply diminishing formula to diminishing parry chance
767 m_realParry = nondiminishing + diminishing * parry_cap[pclass] / (diminishing + parry_cap[pclass] * m_diminishing_k[pclass]);
768 m_realParry = m_realParry < 0.0f ? 0.0f : m_realParry;
769
770 value = std::max(diminishing + nondiminishing, 0.0f);
771
772 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
773 {
774 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) : value;
775 }
776 }
777
779}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110
bool CanParry() const
Definition: Player.h:2193

References CanParry(), CR_DEFENSE_SKILL, CR_PARRY, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realParry, MAX_CLASSES, PLAYER_PARRY_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_PARRY_PERCENT.

Referenced by AuraEffect::HandleAuraModParryPercent(), SetCanParry(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdatePlayerSetting()

void Player::UpdatePlayerSetting ( std::string  source,
uint8  index,
uint32  value 
)
116{
117 auto itr = m_charSettingsMap.find(source);
118 uint8 size = index + 1;
119
120 if (itr == m_charSettingsMap.end())
121 {
122 // Settings not found, initialize a new entry.
123 PlayerSettingVector setting;
124 setting.resize(size);
125
126 for (uint32 itr = 0; itr <= index; ++itr)
127 {
128 PlayerSetting set;
129 set.value = itr == index ? value : 0;
130
131 setting[itr] = set;
132 }
133
134 m_charSettingsMap[source] = setting;
135 }
136 else
137 {
138 if (size > itr->second.size())
139 {
140 itr->second.resize(size);
141 }
142 itr->second[index].value = value;
143 }
144}

References m_charSettingsMap, and PlayerSetting::value.

Referenced by GetPlayerSetting(), and player_settings_commandscript::HandleSettingsAnnouncerFlags().

◆ UpdatePosition() [1/2]

bool Player::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline
2031{ return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
bool UpdatePosition(float x, float y, float z, float orientation, bool teleport=false) override
Definition: PlayerUpdates.cpp:1156

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and UpdatePosition().

Referenced by UpdatePosition().

◆ UpdatePosition() [2/2]

bool Player::UpdatePosition ( float  x,
float  y,
float  z,
float  orientation,
bool  teleport = false 
)
overridevirtual

Reimplemented from Unit.

1158{
1159 if (!Unit::UpdatePosition(x, y, z, orientation, teleport))
1160 return false;
1161
1162 // Update player zone if needed
1163 if (m_needZoneUpdate)
1164 {
1165 uint32 newZone, newArea;
1166 GetZoneAndAreaId(newZone, newArea);
1167 UpdateZone(newZone, newArea);
1168 m_needZoneUpdate = false;
1169 }
1170
1171 if (GetGroup())
1173
1176
1178
1179 return true;
1180}
@ GROUP_UPDATE_FLAG_POSITION
Definition: Group.h:108
@ TRADE_STATUS_TRADE_CANCELED
Definition: SharedDefines.h:3569
void CheckAreaExploreAndOutdoor()
Definition: Player.cpp:5736
Player * GetTrader() const
Definition: Player.h:1387
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:19791

References CheckAreaExploreAndOutdoor(), GetGroup(), GetSession(), GetTrader(), WorldObject::GetZoneAndAreaId(), GROUP_UPDATE_FLAG_POSITION, INTERACTION_DISTANCE, WorldObject::IsWithinDistInMap(), m_needZoneUpdate, WorldSession::SendCancelTrade(), SetGroupUpdateFlag(), TRADE_STATUS_TRADE_CANCELED, Unit::UpdatePosition(), and UpdateZone().

Referenced by spell_rog_killing_spree_aura::HandleEffectPeriodic(), and WorldSession::HandleMoveTeleportAck().

◆ UpdatePotionCooldown()

void Player::UpdatePotionCooldown ( Spell spell = nullptr)
1548{
1549 // no potion used i combat or still in combat
1550 if (!GetLastPotionId() || IsInCombat())
1551 return;
1552
1553 // Call not from spell cast, send cooldown event for item spells if no in
1554 // combat
1555 if (!spell)
1556 {
1557 // spell/item pair let set proper cooldown (except not existed charged
1558 // spell cooldown spellmods for potions)
1559 if (ItemTemplate const* proto =
1560 sObjectMgr->GetItemTemplate(GetLastPotionId()))
1561 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
1562 if (proto->Spells[idx].SpellId &&
1563 proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
1564 if (SpellInfo const* spellInfo =
1565 sSpellMgr->GetSpellInfo(proto->Spells[idx].SpellId))
1566 SendCooldownEvent(spellInfo, GetLastPotionId());
1567 }
1568 // from spell cases (m_lastPotionId set in Spell::SendSpellCooldown)
1569 else
1570 {
1571 if (spell->IsIgnoringCooldowns())
1572 return;
1573
1575 }
1576
1577 SetLastPotionId(0);
1578}
void SetLastPotionId(uint32 item_id)
Definition: Player.h:1821
uint32 GetLastPotionId()
Definition: Player.h:1820
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11056
bool IsIgnoringCooldowns() const
Definition: Spell.cpp:8101

References GetLastPotionId(), Spell::IsIgnoringCooldowns(), Unit::IsInCombat(), ITEM_SPELLTRIGGER_ON_USE, m_lastPotionId, Spell::m_spellInfo, MAX_ITEM_SPELLS, SendCooldownEvent(), SetLastPotionId(), sObjectMgr, and sSpellMgr.

Referenced by Spell::finish().

◆ UpdatePvP()

void Player::UpdatePvP ( bool  state,
bool  _override = false 
)
1531{
1532 if (!state || _override)
1533 {
1534 SetPvP(state);
1535 pvpInfo.EndTimer = 0;
1536 }
1537 else
1538 {
1540 SetPvP(state);
1541 }
1542
1544 sScriptMgr->OnPlayerPVPFlagChange(this, state);
1545}
@ PLAYER_FLAGS_PVP_TIMER
Definition: Player.h:498
void SetPvP(bool state)
Definition: Player.h:1858

References PvPInfo::EndTimer, GameTime::GetGameTime(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, RemovePlayerFlag(), SetPvP(), and sScriptMgr.

Referenced by Unit::CombatStart(), Unit::CombatStartOnCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), FlagPlayerPvP(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleTogglePvP(), UpdatePvPFlag(), and UpdatePvPState().

◆ UpdatePvPFlag()

void Player::UpdatePvPFlag ( time_t  currTime)
373{
374 if (!IsPvP())
375 return;
376
377 if (pvpInfo.EndTimer == 0 || pvpInfo.IsHostile)
378 return;
379
380 if (currTime < (pvpInfo.EndTimer + 300 + 5))
381 {
382 if (currTime > (pvpInfo.EndTimer + 4) && !HasPlayerFlag(PLAYER_FLAGS_PVP_TIMER))
384
385 return;
386 }
387
388 UpdatePvP(false);
389}
void UpdatePvP(bool state, bool _override=false)
Definition: PlayerUpdates.cpp:1530

References PvPInfo::EndTimer, HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, SetPlayerFlag(), and UpdatePvP().

Referenced by Update().

◆ UpdatePvPState()

void Player::UpdatePvPState ( )
1441{
1443
1444 if (pvpInfo.IsHostile) // in hostile area
1445 {
1446 if (!IsPvP() || pvpInfo.EndTimer != 0)
1447 UpdatePvP(true, true);
1448 }
1449 else // in friendly area
1450 {
1452 pvpInfo.EndTimer == 0)
1453 pvpInfo.EndTimer = GameTime::GetGameTime().count(); // start toggle-off
1454 }
1455}
@ PLAYER_FLAGS_IN_PVP
Definition: Player.h:489

References PvPInfo::EndTimer, GameTime::GetGameTime(), HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_IN_PVP, pvpInfo, UpdateFFAPvPState(), and UpdatePvP().

Referenced by AddQuest(), Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), Unit::SetCharm(), and UpdateZone().

◆ UpdateRangedHitChances()

◆ UpdateRating()

void Player::UpdateRating ( CombatRating  cr)
611{
612 int32 amount = m_baseRatingValue[cr];
613 // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT
614 // stat used stored in miscValueB for this aura
615 AuraEffectList const& modRatingFromStat =
617 for (AuraEffectList::const_iterator i = modRatingFromStat.begin();
618 i != modRatingFromStat.end(); ++i)
619 if ((*i)->GetMiscValue() & (1 << cr))
620 amount += int32(CalculatePct(GetStat(Stats((*i)->GetMiscValueB())),
621 (*i)->GetAmount()));
622 if (amount < 0)
623 amount = 0;
624 SetUInt32Value(static_cast<uint16>(PLAYER_FIELD_COMBAT_RATING_1) + static_cast<uint16>(cr), uint32(amount));
625
626 bool affectStats = CanModifyStats();
627
628 switch (cr)
629 {
630 case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst
631 case CR_DEFENSE_SKILL:
633 break;
634 case CR_DODGE:
636 break;
637 case CR_PARRY:
639 break;
640 case CR_BLOCK:
642 break;
643 case CR_HIT_MELEE:
645 break;
646 case CR_HIT_RANGED:
648 break;
649 case CR_HIT_SPELL:
651 break;
652 case CR_CRIT_MELEE:
653 if (affectStats)
654 {
657 }
658 break;
659 case CR_CRIT_RANGED:
660 if (affectStats)
662 break;
663 case CR_CRIT_SPELL:
664 if (affectStats)
666 break;
667 case CR_HIT_TAKEN_MELEE: // Implemented in Unit::MeleeMissChanceCalc
669 break;
670 case CR_HIT_TAKEN_SPELL: // Implemented in Unit::MagicSpellHitResult
671 break;
672 case CR_CRIT_TAKEN_MELEE: // Implemented in Unit::RollMeleeOutcomeAgainst
673 // (only for chance to crit)
675 break;
676 case CR_CRIT_TAKEN_SPELL: // Implemented in Unit::SpellCriticalBonus (only
677 // for chance to crit)
678 break;
679 case CR_HASTE_MELEE: // Implemented in Player::ApplyRatingMod
680 case CR_HASTE_RANGED:
681 case CR_HASTE_SPELL:
682 break;
683 case CR_WEAPON_SKILL_MAINHAND: // Implemented in
684 // Unit::RollMeleeOutcomeAgainst
687 break;
688 case CR_EXPERTISE:
689 if (affectStats)
690 {
693 }
694 break;
696 if (affectStats)
698 break;
699 }
700}
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:240
@ CR_WEAPON_SKILL
Definition: Unit.h:218
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:239
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:238
@ SPELL_AURA_MOD_RATING_FROM_STAT
Definition: SpellAuraDefines.h:283
void UpdateArmorPenetration(int32 amount)
Definition: StatSystem.cpp:847
void UpdateSpellHitChances()
Definition: StatSystem.cpp:865
void UpdateMeleeHitChances()
Definition: StatSystem.cpp:853
void UpdateRangedHitChances()
Definition: StatSystem.cpp:859

References BASE_ATTACK, CalculatePct(), Unit::CanModifyStats(), CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, Unit::GetAuraEffectsByType(), Unit::GetStat(), m_baseRatingValue, OFF_ATTACK, PLAYER_FIELD_COMBAT_RATING_1, RANGED_ATTACK, Unit::SetUInt32Value(), SPELL_AURA_MOD_RATING_FROM_STAT, UpdateAllSpellCritChances(), UpdateArmorPenetration(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDefenseBonusesMod(), UpdateDodgePercentage(), UpdateExpertise(), UpdateMeleeHitChances(), UpdateParryPercentage(), UpdateRangedHitChances(), and UpdateSpellHitChances().

Referenced by ApplyRatingMod(), and UpdateAllRatings().

◆ UpdateResistances()

void Player::UpdateResistances ( uint32  school)
overridevirtual

Implements Unit.

226{
227 if (school > SPELL_SCHOOL_NORMAL)
228 {
229 // cant use GetTotalAuraModValue because of total pct multiplier :P
230 float value = 0.0f;
231 UnitMods unitMod = UnitMods(UNIT_MOD_RESISTANCE_START + school);
232
233 value = GetModifierValue(unitMod, BASE_VALUE);
234 value *= GetModifierValue(unitMod, BASE_PCT);
235 value += GetModifierValue(unitMod, TOTAL_VALUE);
236
238 for(AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
239 {
240 if ((*i)->GetMiscValue() & (1 << (school - 1)))
241 value += int32(GetStat(Stats((*i)->GetMiscValueB())) * (*i)->GetAmount() / 100.0f);
242 }
243
244 value *= GetModifierValue(unitMod, TOTAL_PCT);
245
246 SetResistance(SpellSchools(school), int32(value));
247 }
248 else
249 UpdateArmor();
250}

References BASE_PCT, BASE_VALUE, Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetResistance(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_RESISTANCE_START, and UpdateArmor().

◆ UpdateRuneRegen()

void Player::UpdateRuneRegen ( RuneType  rune)
971{
972 if (rune >= NUM_RUNE_TYPES)
973 return;
974
975 uint32 cooldown = 0;
976
977 for (uint32 i = 0; i < MAX_RUNES; ++i)
978 if (GetBaseRune(i) == rune)
979 {
980 cooldown = GetRuneBaseCooldown(i, true);
981 break;
982 }
983
984 if (cooldown <= 0)
985 return;
986
987 float regen = float(1 * IN_MILLISECONDS) / float(cooldown);
989}
uint32 GetRuneBaseCooldown(uint8 index, bool skipGrace)
Definition: Player.cpp:13314

References GetBaseRune(), GetRuneBaseCooldown(), IN_MILLISECONDS, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, and Object::SetFloatValue().

Referenced by AuraEffect::HandleModPowerRegen().

◆ UpdateShieldBlockValue()

void Player::UpdateShieldBlockValue ( )
523{
525}
uint32 GetShieldBlockValue() const override
Definition: Player.cpp:5094

References GetShieldBlockValue(), PLAYER_SHIELD_BLOCK, and Unit::SetUInt32Value().

Referenced by HandleBaseModValue(), UpdateAllStats(), and UpdateStats().

◆ UpdateSkill()

bool Player::UpdateSkill ( uint32  skill_id,
uint32  step 
)
710{
711 if (!skill_id || !sScriptMgr->OnPlayerCanUpdateSkill(this, skill_id))
712 return false;
713
714 SkillStatusMap::iterator itr = mSkillStatus.find(skill_id);
715 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
716 return false;
717
718 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
719 uint32 data = GetUInt32Value(valueIndex);
720 uint32 value = SKILL_VALUE(data);
721 uint32 max = SKILL_MAX(data);
722
723 sScriptMgr->OnPlayerBeforeUpdateSkill(this, skill_id, value, max, step);
724
725 if ((!max) || (!value) || (value >= max))
726 return false;
727
728 if (value < max)
729 {
730 uint32 new_value = value + step;
731 if (new_value > max)
732 new_value = max;
733
734 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, max));
735 if (itr->second.uState != SKILL_NEW)
736 itr->second.uState = SKILL_CHANGED;
737
738 UpdateSkillEnchantments(skill_id, value, new_value);
740 skill_id);
741
742 sScriptMgr->OnPlayerUpdateSkill(this, skill_id, value, max, step, new_value);
743 return true;
744 }
745
746 return false;
747}

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, sScriptMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateDefense(), and UpdateWeaponSkill().

◆ UpdateSkillEnchantments()

void Player::UpdateSkillEnchantments ( uint16  skill_id,
uint16  curr_value,
uint16  new_value 
)
4682{
4683 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
4684 {
4685 if (m_items[i])
4686 {
4687 for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4688 {
4689 uint32 ench_id = m_items[i]->GetEnchantmentId(EnchantmentSlot(slot));
4690 if (!ench_id)
4691 continue;
4692
4693 SpellItemEnchantmentEntry const* Enchant = sSpellItemEnchantmentStore.LookupEntry(ench_id);
4694 if (!Enchant)
4695 return;
4696
4697 if (Enchant->requiredSkill == skill_id)
4698 {
4699 // Checks if the enchantment needs to be applied or removed
4700 if (curr_value < Enchant->requiredSkillValue && new_value >= Enchant->requiredSkillValue)
4701 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4702 else if (new_value < Enchant->requiredSkillValue && curr_value >= Enchant->requiredSkillValue)
4703 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4704 }
4705
4706 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4707 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4709 && !m_items[i]->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4710 {
4711 SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(m_items[i]->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT));
4712
4713 if (pPrismaticEnchant && pPrismaticEnchant->requiredSkill == skill_id)
4714 {
4715 if (curr_value < pPrismaticEnchant->requiredSkillValue && new_value >= pPrismaticEnchant->requiredSkillValue)
4716 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4717 else if (new_value < pPrismaticEnchant->requiredSkillValue && curr_value >= pPrismaticEnchant->requiredSkillValue)
4718 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4719 }
4720 }
4721 }
4722 }
4723 }
4724}
Definition: Socket.h:52

References ApplyEnchantment(), Item::GetEnchantmentId(), INVENTORY_SLOT_BAG_END, m_items, MAX_ENCHANTMENT_SLOT, PRISMATIC_ENCHANTMENT_SLOT, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, and sSpellItemEnchantmentStore.

Referenced by SetSkill(), UpdateSkill(), and UpdateSkillPro().

◆ UpdateSkillPro()

bool Player::UpdateSkillPro ( uint16  SkillId,
int32  Chance,
uint32  step 
)
914{
915 LOG_DEBUG("entities.player.skills",
916 "UpdateSkillPro(SkillId {}, Chance {:3.1f}%)", SkillId,
917 Chance / 10.0f);
918 if (!SkillId || !sScriptMgr->OnPlayerCanUpdateSkill(this, SkillId))
919 return false;
920
921 if (Chance <= 0) // speedup in 0 chance case
922 {
923 LOG_DEBUG("entities.player.skills",
924 "Player::UpdateSkillPro Chance={:3.1f}% missed",
925 Chance / 10.0f);
926 return false;
927 }
928
929 SkillStatusMap::iterator itr = mSkillStatus.find(SkillId);
930 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
931 return false;
932
933 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
934
935 uint32 data = GetUInt32Value(valueIndex);
936 uint32 SkillValue = SKILL_VALUE(data);
937 uint32 MaxValue = SKILL_MAX(data);
938
939 sScriptMgr->OnPlayerBeforeUpdateSkill(this, SkillId, SkillValue, MaxValue, step);
940
941 if (!MaxValue || !SkillValue || SkillValue >= MaxValue)
942 return false;
943
944 int32 Roll = irand(1, 1000);
945
946 if (Roll <= Chance)
947 {
948 uint32 new_value = SkillValue + step;
949 if (new_value > MaxValue)
950 new_value = MaxValue;
951
952 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, MaxValue));
953 if (itr->second.uState != SKILL_NEW)
954 itr->second.uState = SKILL_CHANGED;
955
956 for (std::size_t i = 0; i < bonusSkillLevelsSize; ++i)
957 {
958 uint32 bsl = bonusSkillLevels[i];
959 if (SkillValue < bsl && new_value >= bsl)
960 {
961 learnSkillRewardedSpells(SkillId, new_value);
962 break;
963 }
964 }
965 UpdateSkillEnchantments(SkillId, SkillValue, new_value);
967 SkillId);
968 LOG_DEBUG("entities.player.skills",
969 "Player::UpdateSkillPro Chance={:3.1f}% taken",
970 Chance / 10.0f);
971
972 sScriptMgr->OnPlayerUpdateSkill(this, SkillId, SkillValue, MaxValue, step, new_value);
973 return true;
974 }
975
976 LOG_DEBUG("entities.player.skills",
977 "Player::UpdateSkillPro Chance={:3.1f}% missed", Chance / 10.0f);
978 return false;
979}
static uint32 bonusSkillLevels[]
Definition: PlayerUpdates.cpp:909
static const std::size_t bonusSkillLevelsSize
Definition: PlayerUpdates.cpp:910
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
Definition: Group.h:143

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, bonusSkillLevels, bonusSkillLevelsSize, Object::GetUInt32Value(), irand(), learnSkillRewardedSpells(), LOG_DEBUG, MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, sScriptMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateCraftSkill(), UpdateFishingSkill(), and UpdateGatherSkill().

◆ UpdateSkillsForLevel()

void Player::UpdateSkillsForLevel ( )

update only level dependent max skill values

maximize skill always

update max skill value if current max skill not maximized

1080{
1081 uint16 maxconfskill = sWorld->GetConfigMaxSkillValue();
1082 uint32 maxSkill = GetMaxSkillValueForLevel();
1083
1084 bool alwaysMaxSkill =
1086
1087 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1088 itr != mSkillStatus.end(); ++itr)
1089 {
1090 if (itr->second.uState == SKILL_DELETED)
1091 continue;
1092
1093 uint32 pskill = itr->first;
1094 SkillRaceClassInfoEntry const* rcEntry =
1096 if (!rcEntry)
1097 continue;
1098
1099 if (GetSkillRangeType(rcEntry) != SKILL_RANGE_LEVEL)
1100 continue;
1101
1102 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1103 uint32 data = GetUInt32Value(valueIndex);
1104 uint32 max = SKILL_MAX(data);
1105 uint32 val = SKILL_VALUE(data);
1106
1108 if (max != 1)
1109 {
1111 if (alwaysMaxSkill ||
1113 {
1114 SetUInt32Value(valueIndex,
1115 MAKE_SKILL_VALUE(maxSkill, maxSkill));
1116 if (itr->second.uState != SKILL_NEW)
1117 itr->second.uState = SKILL_CHANGED;
1118 }
1119 else if (max != maxconfskill)
1121 {
1122 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(val, maxSkill));
1123 if (itr->second.uState != SKILL_NEW)
1124 itr->second.uState = SKILL_CHANGED;
1125 }
1126 }
1127 }
1128}
@ CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL
Definition: IWorld.h:93

References CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_MAX, SKILL_NEW, SKILL_RANGE_LEVEL, SKILL_VALUE, and sWorld.

Referenced by GiveLevel(), InitStatsForLevel(), and LoadFromDB().

◆ UpdateSkillsToMaxSkillsForLevel()

void Player::UpdateSkillsToMaxSkillsForLevel ( )
1131{
1132 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1133 itr != mSkillStatus.end(); ++itr)
1134 {
1135 if (itr->second.uState == SKILL_DELETED)
1136 continue;
1137
1138 uint32 pskill = itr->first;
1139 if (IsProfessionOrRidingSkill(pskill))
1140 continue;
1141 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1142 uint32 data = GetUInt32Value(valueIndex);
1143 uint32 max = SKILL_MAX(data);
1144
1145 if (max > 1)
1146 {
1147 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(max, max));
1148 if (itr->second.uState != SKILL_NEW)
1149 itr->second.uState = SKILL_CHANGED;
1150 }
1151 if (pskill == SKILL_DEFENSE)
1153 }
1154}

References Object::GetUInt32Value(), IsProfessionOrRidingSkill(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DEFENSE, SKILL_DELETED, SKILL_MAX, SKILL_NEW, and UpdateDefenseBonusesMod().

Referenced by GiveLevel(), and misc_commandscript::HandleMaxSkillCommand().

◆ UpdateSoulboundTradeItems()

void Player::UpdateSoulboundTradeItems ( )
4109{
4110 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4111 if (m_itemSoulboundTradeable.empty())
4112 return;
4113
4114 // also checks for garbage data
4115 for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();)
4116 {
4117 ASSERT(*itr);
4118 if ((*itr)->GetOwnerGUID() != GetGUID())
4119 {
4120 m_itemSoulboundTradeable.erase(itr++);
4121 continue;
4122 }
4123 if ((*itr)->CheckSoulboundTradeExpire())
4124 {
4125 m_itemSoulboundTradeable.erase(itr++);
4126 continue;
4127 }
4128 ++itr;
4129 }
4130}

References ASSERT, Object::GetGUID(), m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by Update().

◆ UpdateSpeakTime()

void Player::UpdateSpeakTime ( ChatFloodThrottle::Index  index)
30{
31 // ignore chat spam protection for GMs in any mode
33 return;
34
35 uint32 limit, delay;
36 switch (index)
37 {
39 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT);
40 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY);
41 break;
43 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_COUNT);
44 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_DELAY);
45 [[fallthrough]];
46 default:
47 return;
48 }
49 time_t current = GameTime::GetGameTime().count();
50 if (m_chatFloodData[index].Time > current)
51 {
52 ++m_chatFloodData[index].Count;
53 if (m_chatFloodData[index].Count >= limit)
54 {
55 // prevent overwrite mute time, if message send just before mutes set, for example.
56 time_t new_mute = current + sWorld->getIntConfig(CONFIG_CHATFLOOD_MUTE_TIME);
57 if (GetSession()->m_muteTime < new_mute)
58 GetSession()->m_muteTime = new_mute;
59
60 m_chatFloodData[index].Count = 0;
61 }
62 }
63 else
64 m_chatFloodData[index].Count = 1;
65
66 m_chatFloodData[index].Time = current + delay;
67}
@ CONFIG_CHATFLOOD_MUTE_TIME
Definition: IWorld.h:281
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT
Definition: IWorld.h:279
@ CONFIG_CHATFLOOD_MESSAGE_DELAY
Definition: IWorld.h:278
@ CONFIG_CHATFLOOD_MESSAGE_COUNT
Definition: IWorld.h:277
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY
Definition: IWorld.h:280
std::array< ChatFloodThrottle, ChatFloodThrottle::MAX > m_chatFloodData
Definition: Player.h:2793
@ ADDON
Definition: Player.h:2328
@ REGULAR
Definition: Player.h:2327

References Player::ChatFloodThrottle::ADDON, CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT, CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY, CONFIG_CHATFLOOD_MESSAGE_COUNT, CONFIG_CHATFLOOD_MESSAGE_DELAY, CONFIG_CHATFLOOD_MUTE_TIME, GameTime::GetGameTime(), GetSession(), AccountMgr::IsPlayerAccount(), m_chatFloodData, WorldSession::m_muteTime, Player::ChatFloodThrottle::REGULAR, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode(), and WorldSession::HandleTextEmoteOpcode().

◆ UpdateSpecCount()

void Player::UpdateSpecCount ( uint8  count)
2195{
2196 uint32 curCount = GetSpecsCount();
2197 if (curCount == count)
2198 return;
2199
2200 if (m_activeSpec >= count)
2201 ActivateSpec(0);
2202
2203 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2204 CharacterDatabasePreparedStatement* stmt = nullptr;
2205
2206 // Copy spec data
2207 if (count > curCount)
2208 {
2209 _SaveActions(trans); // make sure the button list is cleaned up
2210 for (ActionButtonList::iterator itr = m_actionButtons.begin();
2211 itr != m_actionButtons.end(); ++itr)
2212 {
2213 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
2214 stmt->SetData(0, GetGUID().GetCounter());
2215 stmt->SetData(1, 1);
2216 stmt->SetData(2, itr->first);
2217 stmt->SetData(3, itr->second.GetAction());
2218 stmt->SetData(4, uint8(itr->second.GetType()));
2219 trans->Append(stmt);
2220 }
2221 }
2222 // Delete spec data for removed spec.
2223 else if (count < curCount)
2224 {
2225 _SaveActions(trans);
2226
2227 stmt = CharacterDatabase.GetPreparedStatement(
2229 stmt->SetData(0, m_activeSpec);
2230 stmt->SetData(1, GetGUID().GetCounter());
2231 trans->Append(stmt);
2232
2233 m_activeSpec = 0;
2234 }
2235
2236 CharacterDatabase.CommitTransaction(trans);
2237
2238 SetSpecsCount(count);
2239
2240 SendTalentsInfoData(false);
2241}
@ CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC
Definition: CharacterDatabase.h:459
void ActivateSpec(uint8 spec)
Definition: Player.cpp:15011
void SetSpecsCount(uint8 count)
Definition: Player.h:1753

References _SaveActions(), ActivateSpec(), CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, CHAR_INS_CHAR_ACTION, CharacterDatabase, Object::GetGUID(), GetSpecsCount(), m_actionButtons, m_activeSpec, SendTalentsInfoData(), PreparedStatementBase::SetData(), and SetSpecsCount().

◆ UpdateSpellCritChance()

void Player::UpdateSpellCritChance ( uint32  school)
823{
824 // For normal school set zero crit chance
825 if (school == SPELL_SCHOOL_NORMAL)
826 {
828 return;
829 }
830 // For others recalculate it from:
831 float crit = 0.0f;
832 // Crit from Intellect
834 // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
836 // Increase crit from SPELL_AURA_MOD_CRIT_PCT
838 // Increase crit by school from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
840 // Increase crit from spell crit ratings
842
843 // Store crit value
845}
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition: SpellAuraDefines.h:134
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:120
@ SPELL_AURA_MOD_CRIT_PCT
Definition: SpellAuraDefines.h:353
float GetSpellCritFromIntellect()
Definition: Player.cpp:5173
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:6017
int32 GetTotalAuraModifierAreaExclusive(AuraType auratype) const
Definition: Unit.cpp:5946

References CR_CRIT_SPELL, GetRatingBonusValue(), GetSpellCritFromIntellect(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierAreaExclusive(), Unit::GetTotalAuraModifierByMiscMask(), PLAYER_SPELL_CRIT_PERCENTAGE1, Object::SetFloatValue(), SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by AuraEffect::HandleModSpellCritChanceShool(), and UpdateAllSpellCritChances().

◆ UpdateSpellDamageAndHealingBonus()

void Player::UpdateSpellDamageAndHealingBonus ( )
178{
179 // Magic damage modifiers implemented in Unit::SpellDamageBonusDone
180 // This information for client side use only
181 // Get healing bonus for all schools
183 // Get damage bonus for all schools
184 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
186}
void SetStatInt32Value(uint16 index, int32 value)
Definition: Object.cpp:798
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12746
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:11981

References MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, Object::SetStatInt32Value(), SPELL_SCHOOL_HOLY, SPELL_SCHOOL_MASK_ALL, Unit::SpellBaseDamageBonusDone(), and Unit::SpellBaseHealingBonusDone().

Referenced by AuraEffect::HandleModHealingDone(), AuraEffect::HandleModSpellDamagePercentFromAttackPower(), AuraEffect::HandleModSpellDamagePercentFromStat(), AuraEffect::HandleModSpellHealingPercentFromAttackPower(), AuraEffect::HandleModSpellHealingPercentFromStat(), UpdateAllStats(), UpdateAttackPowerAndDamage(), and UpdateStats().

◆ UpdateSpellHitChances()

void Player::UpdateSpellHitChances ( )

◆ UpdateStats()

bool Player::UpdateStats ( Stats  stat)
overridevirtual

Implements Unit.

98{
99 if (stat > STAT_SPIRIT)
100 return false;
101
102 // value = ((base_value * base_pct) + total_value) * total_pct
103 float value = GetTotalStatValue(stat);
104
105 SetStat(stat, int32(value));
106
107 switch (stat)
108 {
109 case STAT_STRENGTH:
111 break;
112 case STAT_AGILITY:
113 UpdateArmor();
116 break;
117 case STAT_STAMINA:
119 break;
120 case STAT_INTELLECT:
123 UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
124 break;
125 default:
126 break;
127 }
128
129 if (stat == STAT_STRENGTH)
130 {
134 }
135 else if (stat == STAT_AGILITY)
136 {
139 }
140 else
141 {
142 // Need update (exist AP from stat auras)
147 }
148
151
152 // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat
153 uint32 mask = 0;
155 for (AuraEffectList::const_iterator i = modRatingFromStat.begin(); i != modRatingFromStat.end(); ++i)
156 if (Stats((*i)->GetMiscValueB()) == stat)
157 mask |= (*i)->GetMiscValue();
158 if (mask)
159 {
160 for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
161 if (mask & (1 << rating))
162 ApplyRatingMod(CombatRating(rating), 0, true);
163 }
164 return true;
165}

References ApplyRatingMod(), Unit::GetAuraEffectsByType(), Unit::GetTotalStatValue(), Unit::HasAuraTypeWithMiscvalue(), MAX_COMBAT_RATING, POWER_MANA, Unit::SetStat(), SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RATING_FROM_STAT, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDodgePercentage(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

◆ UpdateTitansGrip()

void Player::UpdateTitansGrip ( )

◆ UpdateTriggerVisibility()

void Player::UpdateTriggerVisibility ( )
1747{
1748 if (m_clientGUIDs.empty())
1749 return;
1750
1751 if (!IsInWorld())
1752 return;
1753
1754 UpdateData udata;
1755 WorldPacket packet;
1756 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin();
1757 itr != m_clientGUIDs.end(); ++itr)
1758 {
1759 if ((*itr).IsCreatureOrVehicle())
1760 {
1761 Creature* creature = GetMap()->GetCreature(*itr);
1762 // Update fields of triggers, transformed units or unselectable
1763 // units (values dependent on GM state)
1764 if (!creature || (!creature->IsTrigger() &&
1765 !creature->HasTransformAura() &&
1767 continue;
1768
1770 creature->BuildValuesUpdateBlockForPlayer(&udata, this);
1772 }
1773 else if ((*itr).IsGameObject())
1774 {
1775 GameObject* go = GetMap()->GetGameObject(*itr);
1776 if (!go)
1777 continue;
1778
1780 go->BuildValuesUpdateBlockForPlayer(&udata, this);
1782 }
1783 }
1784
1785 if (!udata.HasData())
1786 return;
1787
1788 udata.BuildPacket(packet);
1789 GetSession()->SendPacket(&packet);
1790}
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
bool IsTrigger() const
Definition: Creature.h:76
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:196
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:195
bool HasData() const
Definition: UpdateData.h:60
bool HasTransformAura() const
Definition: Unit.h:1713

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), Map::GetCreature(), Map::GetGameObject(), WorldObject::GetMap(), GetSession(), UpdateData::HasData(), Unit::HasTransformAura(), Unit::HasUnitFlag(), Object::IsInWorld(), Creature::IsTrigger(), m_clientGUIDs, Object::RemoveFieldNotifyFlag(), WorldSession::SendPacket(), Object::SetFieldNotifyFlag(), UF_FLAG_PUBLIC, and UNIT_FLAG_NOT_SELECTABLE.

Referenced by gm_commandscript::HandleGMOffCommand(), and gm_commandscript::HandleGMOnCommand().

◆ UpdateVisibilityForPlayer()

void Player::UpdateVisibilityForPlayer ( bool  mapChange = false)
1593{
1594 // After added to map seer must be a player - there is no possibility to
1595 // still have different seer (all charm auras must be already removed)
1596 if (mapChange && m_seer != this)
1597 {
1598 m_seer = this;
1599 }
1600
1601 Acore::VisibleNotifier notifierNoLarge(
1602 *this, mapChange,
1603 false); // visit only objects which are not large; default distance
1604 Cell::VisitAllObjects(m_seer, notifierNoLarge,
1606 notifierNoLarge.SendToSelf();
1607
1608 Acore::VisibleNotifier notifierLarge(
1609 *this, mapChange, true); // visit only large objects; maximum distance
1610 Cell::VisitAllObjects(m_seer, notifierLarge, GetSightRange());
1611 notifierLarge.SendToSelf();
1612
1613 if (mapChange)
1614 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
1615}
#define VISIBILITY_INC_FOR_GOBJECTS
Definition: ObjectDefines.h:28
float GetSightRange(WorldObject const *target=nullptr) const override
Definition: Player.cpp:16226
Position m_last_notify_position
Definition: Unit.h:2012
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius)
Definition: CellImpl.h:185
Definition: GridNotifiers.h:44

References GetSightRange(), Unit::m_last_notify_position, m_seer, Position::Relocate(), Acore::VisibleNotifier::SendToSelf(), VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

Referenced by WorldSession::HandleFarSightOpcode(), SendInitialPacketsAfterAddToMap(), and UpdateObjectVisibility().

◆ UpdateVisibilityOf() [1/2]

template<class T >
void Player::UpdateVisibilityOf ( T *  target,
UpdateData data,
std::vector< Unit * > &  visibleNow 
)
1685{
1686 if (HaveAtClient(target))
1687 {
1688 if (!CanSeeOrDetect(target, false, true))
1689 {
1690 BeforeVisibilityDestroy<T>(target, this);
1691
1692 target->BuildOutOfRangeUpdateBlock(&data);
1693 m_clientGUIDs.erase(target->GetGUID());
1694 }
1695 }
1696 else
1697 {
1698 if (CanSeeOrDetect(target, false, true))
1699 {
1700 target->BuildCreateUpdateBlockForPlayer(&data, this);
1701 UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow);
1702 }
1703 }
1704}
void UpdateVisibilityOf_helper(GuidUnorderedSet &s64, T *target, std::vector< Unit * > &)
Definition: PlayerUpdates.cpp:1638
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1737
bool HaveAtClient(WorldObject const *u) const
Definition: Player.cpp:11360

References WorldObject::CanSeeOrDetect(), HaveAtClient(), m_clientGUIDs, and UpdateVisibilityOf_helper().

◆ UpdateVisibilityOf() [2/2]

void Player::UpdateVisibilityOf ( WorldObject target)
1718{
1719 if (HaveAtClient(target))
1720 {
1721 if (!CanSeeOrDetect(target, false, true))
1722 {
1723 if (target->IsCreature())
1725
1726 target->DestroyForPlayer(this);
1727 m_clientGUIDs.erase(target->GetGUID());
1728 }
1729 }
1730 else
1731 {
1732 if (CanSeeOrDetect(target, false, true))
1733 {
1734 target->SendUpdateToPlayer(this);
1735 m_clientGUIDs.insert(target->GetGUID());
1736
1737 // target aura duration for caster show only if target exist at
1738 // caster client send data at target visibility change (adding to
1739 // client)
1740 if (target->IsUnit())
1741 GetInitialVisiblePackets((Unit*) target);
1742 }
1743 }
1744}
void BeforeVisibilityDestroy< Creature >(Creature *t, Player *p)
Definition: PlayerUpdates.cpp:1676
void GetInitialVisiblePackets(Unit *target)
Definition: PlayerUpdates.cpp:1706

References BeforeVisibilityDestroy< Creature >(), WorldObject::CanSeeOrDetect(), Object::DestroyForPlayer(), Object::GetGUID(), GetInitialVisiblePackets(), HaveAtClient(), Object::IsCreature(), Object::IsUnit(), m_clientGUIDs, Object::SendUpdateToPlayer(), and Object::ToCreature().

Referenced by instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), Acore::VisibleNotifier::SendToSelf(), SetViewpoint(), Acore::VisibleNotifier::Visit(), Acore::PlayerRelocationNotifier::Visit(), and Acore::CreatureRelocationNotifier::Visit().

◆ UpdateWeaponSkill()

void Player::UpdateWeaponSkill ( Unit victim,
WeaponAttackType  attType,
Item item = nullptr 
)
982{
983 if (IsInFeralForm())
984 return; // always maximized SKILL_FERAL_COMBAT in fact
985
987 return; // use weapon but not skill up
988
990 return;
991
992 uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON);
993
994 Item* tmpitem = GetWeaponForAttack(attType, true);
995 if (item && item != tmpitem && !item->IsBroken())
996 {
997 tmpitem = item;
998 }
999
1000 if (!tmpitem && attType == BASE_ATTACK)
1001 {
1002 // Keep unarmed & fist weapon skills in sync
1003 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
1004 UpdateSkill(SKILL_FIST_WEAPONS, weapon_skill_gain);
1005 }
1006 else if (tmpitem && tmpitem->GetTemplate()->SubClass !=
1008 {
1009 switch (tmpitem->GetTemplate()->SubClass)
1010 {
1012 break;
1014 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
1015 [[fallthrough]];
1016 default:
1017 UpdateSkill(tmpitem->GetSkill(), weapon_skill_gain);
1018 break;
1019 }
1020 }
1021
1023}
@ FORM_TREE
Definition: UnitDefines.h:71
@ CREATURE_FLAG_EXTRA_NO_SKILL_GAINS
Definition: CreatureData.h:63
@ ITEM_SUBCLASS_WEAPON_FIST
Definition: ItemTemplate.h:357
@ CONFIG_SKILL_GAIN_WEAPON
Definition: IWorld.h:274

References BASE_ATTACK, CONFIG_SKILL_GAIN_WEAPON, CREATURE_FLAG_EXTRA_NO_SKILL_GAINS, FORM_TREE, Unit::GetShapeshiftForm(), Item::GetSkill(), Item::GetTemplate(), GetWeaponForAttack(), Creature::HasFlagsExtra(), Item::IsBroken(), Object::IsCreature(), Unit::IsInFeralForm(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_FIST, SKILL_FIST_WEAPONS, SKILL_UNARMED, ItemTemplate::SubClass, sWorld, Object::ToCreature(), UpdateAllCritPercentages(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateZone()

void Player::UpdateZone ( uint32  newZone,
uint32  newArea,
bool  force = false 
)
1253{
1254 if (!newZone)
1255 return;
1256
1257 if (m_zoneUpdateId != newZone || force)
1258 {
1259 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1260 sOutdoorPvPMgr->HandlePlayerEnterZone(this, newZone);
1261 sWorldState->HandlePlayerLeaveZone(this, static_cast<AreaTableIDs>(m_zoneUpdateId));
1262 sWorldState->HandlePlayerEnterZone(this, static_cast<AreaTableIDs>(newZone));
1263 }
1264 if (m_zoneUpdateId != newZone)
1265 {
1266 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1267 sBattlefieldMgr->HandlePlayerEnterZone(this, newZone);
1268 SendInitWorldStates(newZone,
1269 newArea); // only if really enters to new zone, not
1270 // just area change, works strange...
1271 if (Guild* guild = GetGuild())
1272 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_ZONEID, newZone);
1273 }
1274
1276
1277 // group update
1278 if (GetGroup())
1280
1281 m_zoneUpdateId = newZone;
1283
1284 // zone changed, so area changed as well, update it
1285 UpdateArea(newArea);
1286
1287 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(newZone);
1288 if (!zone)
1289 return;
1290
1291 if (sWorld->getBoolConfig(CONFIG_WEATHER))
1292 {
1293 if (Weather* weather = WeatherMgr::FindWeather(zone->ID))
1294 weather->SendWeatherUpdateToPlayer(this);
1295 else if (!WeatherMgr::AddWeather(zone->ID))
1296 // send fine weather packet to remove old zone's weather
1298 }
1299
1300 sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea);
1301
1302 // in PvP, any not controlled zone (except zone->team == 6, default case)
1303 // in PvE, only opposition team capital
1304 switch (zone->team)
1305 {
1306 case AREATEAM_ALLY:
1308 GetTeamId(true) != TEAM_ALLIANCE &&
1309 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1310 break;
1311 case AREATEAM_HORDE:
1313 GetTeamId(true) != TEAM_HORDE &&
1314 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1315 break;
1316 case AREATEAM_NONE:
1317 // overwrite for battlegrounds, maybe batter some zone flags but current
1318 // known not 100% fit to this
1319 pvpInfo.IsInHostileArea = sWorld->IsPvPRealm() || InBattleground() ||
1321 break;
1322 default: // 6 in fact
1323 pvpInfo.IsInHostileArea = false;
1324 break;
1325 }
1326
1327 // Treat players having a quest flagging for PvP as always in hostile area
1329
1330 if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city
1331 {
1332 if (!pvpInfo.IsHostile || zone->IsSanctuary())
1334
1335 pvpInfo.IsInNoPvPArea = true;
1336 }
1337 else
1338 RemoveRestFlag(REST_FLAG_IN_CITY); // Recently left a capital city
1339
1341
1342 // remove items with area/map limitations (delete only for alive player to
1343 // allow back in ghost mode) if player resurrected at teleport this will be
1344 // applied in resurrect code
1345 if (IsAlive())
1346 DestroyZoneLimitedItem(true, newZone);
1347
1348 // check some item equip limitations (in result lost CanTitanGrip at talent
1349 // reset, for example)
1351
1352 // recent client version not send leave/join channel packets for built-in
1353 // local channels
1354 UpdateLocalChannels(newZone);
1355
1356 UpdateZoneDependentAuras(newZone);
1357}
@ REST_FLAG_IN_CITY
Definition: Player.h:821
@ GUILD_MEMBER_DATA_ZONEID
Definition: Guild.h:58
@ GROUP_UPDATE_FULL
Definition: Group.h:121
@ CONFIG_WEATHER
Definition: IWorld.h:92
@ AREATEAM_HORDE
Definition: DBCEnums.h:58
@ AREATEAM_NONE
Definition: DBCEnums.h:56
@ AREATEAM_ALLY
Definition: DBCEnums.h:57
@ AREA_FLAG_CAPITAL
Definition: DBCEnums.h:242
@ AREA_FLAG_WINTERGRASP
Definition: DBCEnums.h:258
Weather * AddWeather(uint32 zone_id)
Add a Weather object to the list.
Definition: WeatherMgr.cpp:66
void SendFineWeatherUpdateToPlayer(Player *player)
Definition: WeatherMgr.cpp:144
Weather * FindWeather(uint32 id)
Find a Weather object by the given zoneid.
Definition: WeatherMgr.cpp:49
void UpdateLocalChannels(uint32 newZone)
Definition: PlayerUpdates.cpp:502
void SendInitWorldStates(uint32 zoneId, uint32 areaId)
Definition: Player.cpp:8188
void DestroyZoneLimitedItem(bool update, uint32 new_zone)
Definition: PlayerStorage.cpp:3312
void UpdatePlayerZoneStats(uint32 oldZone, uint32 newZone)
Definition: Map.cpp:569
Weather for one zone.
Definition: Weather.h:64
uint32 ID
Definition: DBCStructure.h:520
uint32 team
Definition: DBCStructure.h:529

References WeatherMgr::AddWeather(), AREA_FLAG_CAPITAL, AREA_FLAG_WINTERGRASP, AREATEAM_ALLY, AREATEAM_HORDE, AREATEAM_NONE, AutoUnequipOffhandIfNeed(), CONFIG_WEATHER, DestroyZoneLimitedItem(), WeatherMgr::FindWeather(), AreaTableEntry::flags, GetGroup(), GetGuild(), WorldObject::GetMap(), GetTeamId(), GROUP_UPDATE_FULL, GUILD_MEMBER_DATA_ZONEID, HasPvPForcingQuest(), AreaTableEntry::ID, InBattleground(), Unit::IsAlive(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_zoneUpdateId, m_zoneUpdateTimer, pvpInfo, RemoveRestFlag(), REST_FLAG_IN_CITY, sAreaTableStore, sBattlefieldMgr, WeatherMgr::SendFineWeatherUpdateToPlayer(), SendInitWorldStates(), SetGroupUpdateFlag(), SetRestFlag(), sOutdoorPvPMgr, sScriptMgr, sWorld, sWorldState, AreaTableEntry::team, TEAM_ALLIANCE, TEAM_HORDE, UpdateArea(), UpdateLocalChannels(), Map::UpdatePlayerZoneStats(), UpdatePvPState(), UpdateZoneDependentAuras(), and ZONE_UPDATE_INTERVAL.

Referenced by WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), Map::RemovePlayerFromMap(), ResurrectPlayer(), SendInitialPacketsAfterAddToMap(), Update(), and UpdatePosition().

◆ UpdateZoneDependentAuras()

void Player::UpdateZoneDependentAuras ( uint32  zone_id)
1854{
1855 // Some spells applied at enter into zone (with subzones), aura removed in
1856 // UpdateAreaDependentAuras that called always at zone->area update
1857 SpellAreaForAreaMapBounds saBounds =
1858 sSpellMgr->GetSpellAreaForAreaMapBounds(newZone);
1859 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1860 itr != saBounds.second; ++itr)
1861 if (itr->second->autocast &&
1862 itr->second->IsFitToRequirements(this, newZone, 0))
1863 if (!HasAura(itr->second->spellId))
1864 CastSpell(this, itr->second->spellId, true);
1865}

References Unit::CastSpell(), Unit::HasAura(), and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), and UpdateZone().

◆ VehicleSpellInitialize()

void Player::VehicleSpellInitialize ( )
9581{
9582 Creature* vehicle = GetVehicleCreatureBase();
9583 if (!vehicle)
9584 return;
9585
9586 uint8 cooldownCount = vehicle->m_CreatureSpellCooldowns.size();
9587
9588 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * 10 + 1 + 1 + cooldownCount * (4 + 2 + 4 + 4));
9589 data << vehicle->GetGUID(); // Guid
9590 data << uint16(0); // Pet Family (0 for all vehicles)
9591 data << uint32(vehicle->IsSummon() ? vehicle->ToTempSummon()->GetTimer() : 0); // Duration
9592 // The following three segments are read by the client as one uint32
9593 data << uint8(vehicle->GetReactState()); // React State
9594 data << uint8(0); // Command State
9595 data << uint16(0x800); // DisableActions (set for all vehicles)
9596
9597 for (uint32 i = 0; i < MAX_CREATURE_SPELLS; ++i)
9598 {
9599 uint32 spellId = vehicle->m_spells[i];
9600 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9601 if (!spellInfo)
9602 {
9603 data << uint16(0) << uint8(0) << uint8(i + 8);
9604 continue;
9605 }
9606
9607 ConditionList conditions = sConditionMgr->GetConditionsForVehicleSpell(vehicle->GetEntry(), spellId);
9608 if (!sConditionMgr->IsObjectMeetToConditions(this, vehicle, conditions))
9609 {
9610 LOG_DEBUG("condition", "VehicleSpellInitialize: conditions not met for Vehicle entry {} spell {}", vehicle->ToCreature()->GetEntry(), spellId);
9611 data << uint16(0) << uint8(0) << uint8(i + 8);
9612 continue;
9613 }
9614
9615 if (spellInfo->IsPassive())
9616 vehicle->CastSpell(vehicle, spellId, true);
9617
9618 data << uint32(MAKE_UNIT_ACTION_BUTTON(spellId, i + 8));
9619 }
9620
9622 data << uint32(0);
9623
9624 data << uint8(0); // Auras?
9625
9626 // Cooldowns
9627 data << uint8(cooldownCount);
9628
9629 uint32 curTime = GameTime::GetGameTimeMS().count();
9631
9632 for (CreatureSpellCooldowns::const_iterator itr = vehicle->m_CreatureSpellCooldowns.begin(); itr != vehicle->m_CreatureSpellCooldowns.end(); ++itr)
9633 {
9634 uint16 category = itr->second.category;
9635 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9636
9637 data << uint32(itr->first); // spellid
9638 data << uint16(itr->second.category); // spell category
9639
9640 // send infinity cooldown in special format
9641 if (itr->second.end >= infTime)
9642 {
9643 data << uint32(1); // cooldown
9644 data << uint32(0x80000000); // category cooldown
9645 continue;
9646 }
9647
9648 data << uint32(category ? 0 : cooldown); // cooldown
9649 data << uint32(category ? cooldown : 0); // category cooldown
9650 }
9651
9652 GetSession()->SendPacket(&data);
9653}
static constexpr uint32 MAX_CREATURE_SPELLS
Definition: Unit.h:46
#define MAX_SPELL_CONTROL_BAR
Definition: CharmInfo.h:27
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition: Creature.h:254
uint32 GetTimer()
Definition: TemporarySummon.h:58
Creature * GetVehicleCreatureBase() const
Definition: Unit.cpp:18780
TempSummon * ToTempSummon()
Definition: Unit.h:686
bool IsSummon() const
Definition: Unit.h:744

References Unit::CastSpell(), Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), Creature::GetReactState(), GetSession(), TempSummon::GetTimer(), Unit::GetVehicleCreatureBase(), infinityCooldownDelayCheck, SpellInfo::IsPassive(), Unit::IsSummon(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Creature::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_CREATURE_SPELLS, MAX_SPELL_CONTROL_BAR, sConditionMgr, WorldSession::SendPacket(), SMSG_PET_SPELLS, sSpellMgr, Object::ToCreature(), and Unit::ToTempSummon().

Referenced by Unit::SetCharmedBy().

◆ VisualizeItem()

void Player::VisualizeItem ( uint8  slot,
Item pItem 
)
2876{
2877 if (!pItem)
2878 return;
2879
2880 // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory)
2882 pItem->SetBinding(true);
2883
2884 LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = {}, item = {}", slot, pItem->GetEntry());
2885
2886 m_items[slot] = pItem;
2887 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2890 pItem->SetSlot(slot);
2891 pItem->SetContainer(nullptr);
2892
2893 if (slot < EQUIPMENT_SLOT_END)
2894 SetVisibleItemSlot(slot, pItem);
2895
2896 pItem->SetState(ITEM_CHANGED, this);
2897}

References BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, EQUIPMENT_SLOT_END, Object::GetEntry(), Object::GetGUID(), Item::GetTemplate(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, Item::SetBinding(), Item::SetContainer(), Object::SetGuidValue(), Item::SetSlot(), Item::SetState(), and SetVisibleItemSlot().

Referenced by EquipItem(), and QuickEquipItem().

◆ Whisper() [1/2]

void Player::Whisper ( std::string_view  text,
Language  language,
Player receiver,
bool  = false 
)
overridevirtual

Handles whispers from Addons and players based on sender, receiver's guid and language.

Reimplemented from Unit.

9414{
9415 ASSERT(target);
9416
9417 bool isAddonMessage = language == LANG_ADDON;
9418
9419 if (!isAddonMessage) // if not addon data
9420 language = LANG_UNIVERSAL; // whispers should always be readable
9421
9422 std::string _text(text);
9423
9424 if (!sScriptMgr->OnPlayerCanUseChat(this, CHAT_MSG_WHISPER, language, _text, target))
9425 {
9426 return;
9427 }
9428
9429 sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target);
9430
9431 WorldPacket data;
9432 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, language, this, this, _text);
9433 target->GetSession()->SendPacket(&data);
9434
9435 // rest stuff shouldn't happen in case of addon message
9436 if (isAddonMessage)
9437 return;
9438
9439 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
9440 GetSession()->SendPacket(&data);
9441
9442 if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster())
9443 {
9444 SetAcceptWhispers(true);
9446 }
9447
9448 // announce afk or dnd message
9449 if (target->isAFK())
9450 {
9451 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, target->GetName(), target->autoReplyMsg);
9452 }
9453 else if (target->isDND())
9454 {
9455 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, target->GetName(), target->autoReplyMsg);
9456 }
9457}
@ LANG_PLAYER_DND
Definition: Language.h:673
@ LANG_PLAYER_AFK
Definition: Language.h:674
@ LANG_COMMAND_WHISPERON
Definition: Language.h:331
@ CHAT_MSG_WHISPER_INFORM
Definition: SharedDefines.h:3161
@ CHAT_MSG_WHISPER
Definition: SharedDefines.h:3159
Language
Definition: SharedDefines.h:734
@ LANG_ADDON
Definition: SharedDefines.h:753
bool isAcceptWhispers() const
Definition: Player.h:1174

References ASSERT, autoReplyMsg, ChatHandler::BuildChatPacket(), CHAT_MSG_WHISPER, CHAT_MSG_WHISPER_INFORM, WorldObject::GetName(), GetSession(), isAcceptWhispers(), isAFK(), isDND(), IsGameMaster(), LANG_ADDON, LANG_COMMAND_WHISPERON, LANG_PLAYER_AFK, LANG_PLAYER_DND, LANG_UNIVERSAL, ChatHandler::PSendSysMessage(), WorldSession::SendPacket(), ChatHandler::SendSysMessage(), SetAcceptWhispers(), and sScriptMgr.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Whisper() [2/2]

void Player::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
overridevirtual

Reimplemented from Unit.

9460{
9461 if (!target)
9462 return;
9463
9464 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
9465 if (!bct)
9466 {
9467 LOG_ERROR("entities.unit", "Player::Whisper: `broadcast_text` was not {} found", textId);
9468 return;
9469 }
9470
9472 WorldPacket data;
9473 if (isBossWhisper)
9474 ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9475 else
9476 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9477 target->SendDirectMessage(&data);
9478}
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3194
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition: ObjectMgr.h:456

References ChatHandler::BuildChatPacket(), CHAT_MSG_RAID_BOSS_WHISPER, CHAT_MSG_WHISPER, Unit::getGender(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Player::Yell ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles yelled message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9371{
9372 std::string _text(text);
9373
9374 if (!sScriptMgr->OnPlayerCanUseChat(this, CHAT_MSG_YELL, language, _text))
9375 {
9376 return;
9377 }
9378
9379 sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text);
9380
9381 WorldPacket data;
9382 ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text);
9383 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true, false, false, true);
9384}
@ CONFIG_LISTEN_RANGE_YELL
Definition: IWorld.h:194
@ CHAT_MSG_YELL
Definition: SharedDefines.h:3158

References ChatHandler::BuildChatPacket(), CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Yell() [2/2]

void Player::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9387{
9388 Talk(textId, CHAT_MSG_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
9389}

References CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Friends And Related Function Documentation

◆ CinematicMgr

friend class CinematicMgr
friend

Referenced by Player().

◆ Item::AddToUpdateQueueOf

void Item::AddToUpdateQueueOf ( Player player)
friend

◆ Item::RemoveFromUpdateQueueOf

void Item::RemoveFromUpdateQueueOf ( Player player)
friend

◆ WorldSession

friend class WorldSession
friend

Member Data Documentation

◆ _activeCheats

uint32 Player::_activeCheats
private

◆ _BgBattlegroundQueueID

◆ _cinematicMgr

CinematicMgr* Player::_cinematicMgr
private

◆ _corpseLocation

◆ _farSightDistance

Optional<float> Player::_farSightDistance = { }
private

◆ _innTriggerId

uint32 Player::_innTriggerId
protected

◆ _instanceResetTimes

◆ _pendingBindId

uint32 Player::_pendingBindId
private

◆ _pendingBindTimer

uint32 Player::_pendingBindTimer
private

Referenced by SetPendingBind(), and Update().

◆ _restBonus

float Player::_restBonus
protected

◆ _restFlagMask

uint32 Player::_restFlagMask
protected

◆ _restTime

time_t Player::_restTime
protected

◆ _wasOutdoor

bool Player::_wasOutdoor
private

◆ autoReplyMsg

std::string Player::autoReplyMsg

◆ bgZoneIdToFillWorldStates

std::unordered_map< int, bgZoneRef > Player::bgZoneIdToFillWorldStates = {}
static

Referenced by SendInitWorldStates().

◆ duel

◆ healthBeforeDuel

uint32 Player::healthBeforeDuel
private

◆ isDebugAreaTriggers

◆ ItemSetEff

std::vector<ItemSetEffect*> Player::ItemSetEff

◆ m_achievementMgr

◆ m_actionButtons

◆ m_activeSpec

◆ m_additionalSaveMask

uint8 Player::m_additionalSaveMask
protected

◆ m_additionalSaveTimer

uint16 Player::m_additionalSaveTimer
protected

◆ m_ammoDPS

float Player::m_ammoDPS
protected

◆ m_AreaID

uint32 Player::m_AreaID
protected

◆ m_areaUpdateId

uint32 Player::m_areaUpdateId
protected

◆ m_ArenaTeamIdInvited

uint32 Player::m_ArenaTeamIdInvited
protected

◆ m_ArmorProficiency

uint32 Player::m_ArmorProficiency
protected

◆ m_atLoginFlags

uint32 Player::m_atLoginFlags
protected

◆ m_auraBaseMod

◆ m_auraRaidUpdateMask

◆ m_baseFeralAP

uint32 Player::m_baseFeralAP
protected

◆ m_baseHealthRegen

uint32 Player::m_baseHealthRegen
protected

◆ m_baseManaRegen

uint32 Player::m_baseManaRegen
protected

◆ m_baseRatingValue

int32 Player::m_baseRatingValue[MAX_COMBAT_RATING]
protected

◆ m_baseSpellPower

uint32 Player::m_baseSpellPower
protected

◆ m_bgData

◆ m_bHasDelayedTeleport

bool Player::m_bHasDelayedTeleport
private

◆ m_bMustDelayTeleport

bool Player::m_bMustDelayTeleport
private

◆ m_bPassOnGroupLoot

bool Player::m_bPassOnGroupLoot
protected

◆ m_canBlock

bool Player::m_canBlock
protected

Referenced by CanBlock(), Player(), and SetCanBlock().

◆ m_canKnockback

bool Player::m_canKnockback
private

◆ m_canParry

bool Player::m_canParry
protected

Referenced by CanParry(), Player(), and SetCanParry().

◆ m_canTeleport

bool Player::m_canTeleport
private

Referenced by CanTeleport(), Player(), and SetCanTeleport().

◆ m_canTitanGrip

bool Player::m_canTitanGrip
protected

◆ m_ChampioningFaction

uint32 Player::m_ChampioningFaction
private

◆ m_channels

◆ m_charmAISpells

uint32 Player::m_charmAISpells[NUM_CAI_SPELLS]
protected

◆ m_charmUpdateTimer

uint32 Player::m_charmUpdateTimer

Referenced by Player(), and Update().

◆ m_charSettingsMap

◆ m_chatFloodData

std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> Player::m_chatFloodData
protected

Referenced by UpdateSpeakTime().

◆ m_cinematic

uint8 Player::m_cinematic
protected

◆ m_clientGUIDs

◆ m_contestedPvPTimer

uint32 Player::m_contestedPvPTimer
protected

◆ m_creationTime

Seconds Player::m_creationTime
private

◆ m_currentBuybackSlot

uint32 Player::m_currentBuybackSlot
protected

◆ m_DailyQuestChanged

bool Player::m_DailyQuestChanged
protected

◆ m_deathExpireTime

◆ m_deathTimer

◆ m_declinedname

DeclinedName* Player::m_declinedname
protected

◆ m_DelayedOperations

uint32 Player::m_DelayedOperations
private

◆ m_DFQuests

◆ m_divider

ObjectGuid Player::m_divider
protected

Referenced by GetDivider(), and SetDivider().

◆ m_drunkTimer

uint32 Player::m_drunkTimer
protected

◆ m_drwGUID

ObjectGuid Player::m_drwGUID

◆ m_dungeonDifficulty

Difficulty Player::m_dungeonDifficulty
protected

◆ m_enchantDuration

◆ m_entryPointData

◆ m_EquipmentSets

◆ m_Expertise

float Player::m_Expertise
protected

◆ m_extraBonusTalentCount

◆ m_ExtraFlags

◆ m_flightSpellActivated

uint32 Player::m_flightSpellActivated
private

◆ m_foodEmoteTimerCount

uint32 Player::m_foodEmoteTimerCount
protected

Referenced by Player(), and RegenerateAll().

◆ m_forced_speed_changes

uint8 Player::m_forced_speed_changes[MAX_MOVE_TYPE]

◆ m_GlobalCooldownMgr

GlobalCooldownMgr Player::m_GlobalCooldownMgr
protected

Referenced by GetGlobalCooldownMgr().

◆ m_Glyphs

◆ m_grantableLevels

uint8 Player::m_grantableLevels
protected

◆ m_group

◆ m_groupInvite

Group* Player::m_groupInvite
protected

Referenced by GetGroupInvite(), and SetGroupInvite().

◆ m_groupUpdateMask

uint32 Player::m_groupUpdateMask
protected

◆ m_GuildIdInvited

uint32 Player::m_GuildIdInvited
protected

◆ m_homebindAreaId

uint16 Player::m_homebindAreaId

◆ m_homebindMapId

◆ m_HomebindTimer

uint32 Player::m_HomebindTimer

Referenced by Player(), and UpdateHomebindTime().

◆ m_homebindX

◆ m_homebindY

◆ m_homebindZ

◆ m_hostileReferenceCheckTimer

uint16 Player::m_hostileReferenceCheckTimer
protected

Referenced by Player(), and Update().

◆ m_ingametime

uint32 Player::m_ingametime
protected

◆ m_InstanceValid

◆ m_IsBGRandomWinner

bool Player::m_IsBGRandomWinner
protected

◆ m_isInSharedVisionOf

std::set<Unit*> Player::m_isInSharedVisionOf

◆ m_isInstantFlightOn

bool Player::m_isInstantFlightOn
private

◆ m_isInWater

bool Player::m_isInWater
private

Referenced by IsInWater(), Player(), and SetInWater().

◆ m_itemDuration

◆ m_items

◆ m_itemSoulboundTradeable

ItemDurationList Player::m_itemSoulboundTradeable
protected

◆ m_itemUpdateQueue

std::vector<Item*> Player::m_itemUpdateQueue
protected

◆ m_itemUpdateQueueBlocked

bool Player::m_itemUpdateQueueBlocked
protected

◆ m_Last_tick

time_t Player::m_Last_tick

Referenced by Create(), Player(), and Update().

◆ m_lastDailyQuestTime

time_t Player::m_lastDailyQuestTime
protected

◆ m_lastFallTime

uint32 Player::m_lastFallTime
private

◆ m_lastFallZ

float Player::m_lastFallZ
private

◆ m_lastHonorUpdateTime

time_t Player::m_lastHonorUpdateTime
protected

◆ m_lastpetnumber

uint32 Player::m_lastpetnumber
protected

◆ m_lastPotionId

uint32 Player::m_lastPotionId
protected

◆ m_logintime

time_t Player::m_logintime

Referenced by AddItemToBuyBackSlot(), and Player().

◆ m_lootGuid

ObjectGuid Player::m_lootGuid
protected

Referenced by GetLootGUID(), and SetLootGUID().

◆ m_mail

◆ m_mailsUpdated

◆ m_mapRef

MapReference Player::m_mapRef
private

Referenced by GetMapRef(), and SetMap().

◆ m_MirrorTimer

int32 Player::m_MirrorTimer[MAX_TIMERS]
private

◆ m_MirrorTimerFlags

uint8 Player::m_MirrorTimerFlags
private

◆ m_MirrorTimerFlagsLast

uint8 Player::m_MirrorTimerFlagsLast
private

◆ m_MonthlyQuestChanged

bool Player::m_MonthlyQuestChanged
protected

◆ m_monthlyquests

◆ m_MountBlockId

uint32 Player::m_MountBlockId
protected

◆ m_mover

◆ m_NeedToSaveGlyphs

bool Player::m_NeedToSaveGlyphs
protected

◆ m_needZoneUpdate

bool Player::m_needZoneUpdate
protected

◆ m_newVisible

std::vector<Unit*> Player::m_newVisible

◆ m_nextMailDelivereTime

time_t Player::m_nextMailDelivereTime

◆ m_nextSave

uint32 Player::m_nextSave
protected

◆ m_OffhandExpertise

float Player::m_OffhandExpertise
protected

◆ m_oldpetspell

uint32 Player::m_oldpetspell
private

◆ m_originalGroup

GroupReference Player::m_originalGroup
protected

◆ m_pendingSpectatorForBG

uint32 Player::m_pendingSpectatorForBG

◆ m_pendingSpectatorInviteInstanceId

uint32 Player::m_pendingSpectatorInviteInstanceId

◆ m_petStable

std::unique_ptr<PetStable> Player::m_petStable
private

◆ m_Played_time

◆ m_powerFraction

float Player::m_powerFraction[MAX_POWERS]
protected

Referenced by Player(), and Regenerate().

◆ m_questRewardTalentCount

uint32 Player::m_questRewardTalentCount
protected

◆ m_QuestStatus

◆ m_QuestStatusSave

◆ m_raidDifficulty

Difficulty Player::m_raidDifficulty
protected

◆ m_raidMapDifficulty

Difficulty Player::m_raidMapDifficulty
protected

◆ m_realDodge

float Player::m_realDodge
protected

◆ m_realParry

float Player::m_realParry
protected

◆ m_recallMap

uint32 Player::m_recallMap

Referenced by Player(), and SaveRecallPosition().

◆ m_recallO

float Player::m_recallO

Referenced by Player(), and SaveRecallPosition().

◆ m_recallX

float Player::m_recallX

Referenced by Player(), and SaveRecallPosition().

◆ m_recallY

float Player::m_recallY

Referenced by Player(), and SaveRecallPosition().

◆ m_recallZ

float Player::m_recallZ

Referenced by Player(), and SaveRecallPosition().

◆ m_receivedSpectatorResetFor

◆ m_refundableItems

RefundableItemsSet Player::m_refundableItems
private

◆ m_regenTimerCount

uint32 Player::m_regenTimerCount
protected

◆ m_reputationMgr

◆ m_resetTalentsCost

uint32 Player::m_resetTalentsCost
protected

◆ m_resetTalentsTime

time_t Player::m_resetTalentsTime
protected

◆ m_resurrectGUID

ObjectGuid Player::m_resurrectGUID
protected

◆ m_resurrectHealth

uint32 Player::m_resurrectHealth
protected

◆ m_resurrectMana

uint32 Player::m_resurrectMana
protected

◆ m_resurrectMap

uint32 Player::m_resurrectMap
protected

◆ m_resurrectX

float Player::m_resurrectX
protected

◆ m_resurrectY

float Player::m_resurrectY
protected

◆ m_resurrectZ

float Player::m_resurrectZ
protected

◆ m_RewardedQuests

◆ m_RewardedQuestsSave

QuestStatusSaveMap Player::m_RewardedQuestsSave
protected

◆ m_runes

◆ m_SeasonalQuestChanged

bool Player::m_SeasonalQuestChanged
protected

◆ m_seasonalquests

◆ m_seer

◆ m_session

◆ m_social

PlayerSocial* Player::m_social
protected

Referenced by GetSocial(), LoadFromDB(), and Player().

◆ m_soulboundTradableLock

std::mutex Player::m_soulboundTradableLock
protected

◆ m_specsCount

◆ m_spellCooldowns

◆ m_spellMods

◆ m_spellModTakingSpell

◆ m_spellPenetrationItemMod

int32 Player::m_spellPenetrationItemMod
protected

◆ m_spells

◆ m_summon_asSpectator

bool Player::m_summon_asSpectator
protected

◆ m_summon_expire

time_t Player::m_summon_expire
protected

◆ m_summon_mapid

uint32 Player::m_summon_mapid
protected

◆ m_summon_x

float Player::m_summon_x
protected

◆ m_summon_y

float Player::m_summon_y
protected

◆ m_summon_z

float Player::m_summon_z
protected

◆ m_swingErrorMsg

uint8 Player::m_swingErrorMsg
protected

Referenced by Player(), and Update().

◆ m_talents

◆ m_taxi

◆ m_team

TeamId Player::m_team
protected

◆ m_temporaryUnsummonedPetNumber

◆ m_timedquests

QuestSet Player::m_timedquests
protected

◆ m_trade

◆ m_usedTalentCount

uint32 Player::m_usedTalentCount
protected

◆ m_weaponChangeTimer

uint32 Player::m_weaponChangeTimer
protected

◆ m_WeaponProficiency

uint32 Player::m_WeaponProficiency
protected

◆ m_WeeklyQuestChanged

bool Player::m_WeeklyQuestChanged
protected

◆ m_weeklyquests

◆ m_zoneUpdateId

uint32 Player::m_zoneUpdateId
protected

◆ m_zoneUpdateTimer

uint32 Player::m_zoneUpdateTimer
protected

Referenced by Player(), Update(), and UpdateZone().

◆ manaBeforeDuel

uint32 Player::manaBeforeDuel
private

◆ mMitems

ItemMap Player::mMitems

◆ mSemaphoreTeleport_Far

time_t Player::mSemaphoreTeleport_Far
private

◆ mSemaphoreTeleport_Near

time_t Player::mSemaphoreTeleport_Near
private

◆ mSkillStatus

◆ PlayerTalkClass

PlayerMenu* Player::PlayerTalkClass

Referenced by AddGossipItemFor(), ClearGossipMenuFor(), CloseGossipMenuFor(), Spell::EffectQuestStart(), go_wind_stone::go_wind_stoneAI::GossipSelect(), OPvPCapturePointZM_Graveyard::HandleGossipOption(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverCancel(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), WorldSession::HandleQuestQueryOpcode(), npc_wg_quest_giver::OnGossipHello(), npc_elder_clearwater::OnGossipHello(), npc_experience::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_cos_chromie_middle::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), OnGossipSelect(), Player(), PrepareGossipMenu(), PrepareQuestMenu(), WorldSession::SendBindPoint(), SendGossipMenuFor(), SendPreparedGossip(), SendPreparedQuest(), npc_costumed_orphan_matron::sGossipHello(), npc_pet_trainer::npc_pet_trainerAI::sGossipSelect(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_echo_of_medivh::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_sergeant_bly::npc_sergeant_blyAI::sGossipSelect(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), and ~Player().

◆ pvpInfo

◆ SpellQueue

◆ teleportStore_dest

WorldLocation Player::teleportStore_dest
private

Referenced by GetTeleportDest(), TeleportTo(), and Update().

◆ teleportStore_options

uint32 Player::teleportStore_options
private

Referenced by Player(), TeleportTo(), and Update().

◆ unReadMails

◆ WhisperList